Class: HTTPClient::Session
- Inherits:
-
Object
- Object
- HTTPClient::Session
- Defined in:
- lib/httpclient.rb,
lib/httpclient/session.rb
Overview
Manages a HTTP session with a Site.
Direct Known Subclasses
Defined Under Namespace
Classes: LenientInflater
Constant Summary collapse
- BadResponse =
::HTTPClient::BadResponseError
Instance Attribute Summary collapse
-
#connect_retry ⇒ Object
Returns the value of attribute connect_retry.
-
#connect_timeout ⇒ Object
Returns the value of attribute connect_timeout.
-
#debug_dev ⇒ Object
Device for dumping log for debugging.
-
#dest ⇒ Object
readonly
Destination site.
-
#last_used ⇒ Object
readonly
Returns the value of attribute last_used.
-
#protocol_retry_count ⇒ Object
Returns the value of attribute protocol_retry_count.
-
#proxy ⇒ Object
Proxy site.
-
#read_block_size ⇒ Object
Returns the value of attribute read_block_size.
-
#receive_timeout ⇒ Object
Returns the value of attribute receive_timeout.
-
#requested_version ⇒ Object
Requested protocol version.
-
#send_timeout ⇒ Object
Returns the value of attribute send_timeout.
-
#socket_local ⇒ Object
Returns the value of attribute socket_local.
-
#socket_sync ⇒ Object
Boolean value for Socket#sync.
-
#ssl_config ⇒ Object
Returns the value of attribute ssl_config.
-
#ssl_peer_cert ⇒ Object
readonly
Returns the value of attribute ssl_peer_cert.
-
#test_loopback_http_response ⇒ Object
Returns the value of attribute test_loopback_http_response.
-
#transparent_gzip_decompression ⇒ Object
Returns the value of attribute transparent_gzip_decompression.
Instance Method Summary collapse
- #close ⇒ Object
- #closed? ⇒ Boolean
- #connect_ssl_proxy(socket, uri) ⇒ Object
- #create_loopback_socket(host, port, str) ⇒ Object
- #create_socket(host, port) ⇒ Object
- #eof? ⇒ Boolean
- #get_body(&block) ⇒ Object
- #get_header ⇒ Object
-
#initialize(client, dest, agent_name, from) ⇒ Session
constructor
A new instance of Session.
-
#query(req) ⇒ Object
Send a request to the server.
Methods included from Util
#argument_to_hash, hash_find_value, #http?, #https?, #keyword_argument, try_require, uri_dirname, uri_part_of, urify, #warning
Methods included from Timeout
Constructor Details
#initialize(client, dest, agent_name, from) ⇒ Session
Returns a new instance of Session.
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 |
# File 'lib/httpclient/session.rb', line 456 def initialize(client, dest, agent_name, from) @client = client @dest = dest @proxy = nil @socket_sync = true @requested_version = nil @debug_dev = nil @connect_timeout = nil @connect_retry = 1 @send_timeout = nil @receive_timeout = nil @read_block_size = nil @protocol_retry_count = 5 @ssl_config = nil @ssl_peer_cert = nil @test_loopback_http_response = nil @socket_local = Site::EMPTY @agent_name = agent_name @from = from @state = :INIT @requests = [] @status = nil @reason = nil @headers = [] @socket = nil @readbuf = nil @transparent_gzip_decompression = false @last_used = nil end |
Instance Attribute Details
#connect_retry ⇒ Object
Returns the value of attribute connect_retry.
441 442 443 |
# File 'lib/httpclient/session.rb', line 441 def connect_retry @connect_retry end |
#connect_timeout ⇒ Object
Returns the value of attribute connect_timeout.
440 441 442 |
# File 'lib/httpclient/session.rb', line 440 def connect_timeout @connect_timeout end |
#debug_dev ⇒ Object
Device for dumping log for debugging
438 439 440 |
# File 'lib/httpclient/session.rb', line 438 def debug_dev @debug_dev end |
#dest ⇒ Object (readonly)
Destination site
430 431 432 |
# File 'lib/httpclient/session.rb', line 430 def dest @dest end |
#last_used ⇒ Object (readonly)
Returns the value of attribute last_used.
454 455 456 |
# File 'lib/httpclient/session.rb', line 454 def last_used @last_used end |
#protocol_retry_count ⇒ Object
Returns the value of attribute protocol_retry_count.
445 446 447 |
# File 'lib/httpclient/session.rb', line 445 def protocol_retry_count @protocol_retry_count end |
#proxy ⇒ Object
Proxy site
432 433 434 |
# File 'lib/httpclient/session.rb', line 432 def proxy @proxy end |
#read_block_size ⇒ Object
Returns the value of attribute read_block_size.
444 445 446 |
# File 'lib/httpclient/session.rb', line 444 def read_block_size @read_block_size end |
#receive_timeout ⇒ Object
Returns the value of attribute receive_timeout.
443 444 445 |
# File 'lib/httpclient/session.rb', line 443 def receive_timeout @receive_timeout end |
#requested_version ⇒ Object
Requested protocol version
436 437 438 |
# File 'lib/httpclient/session.rb', line 436 def requested_version @requested_version end |
#send_timeout ⇒ Object
Returns the value of attribute send_timeout.
442 443 444 |
# File 'lib/httpclient/session.rb', line 442 def send_timeout @send_timeout end |
#socket_local ⇒ Object
Returns the value of attribute socket_local.
447 448 449 |
# File 'lib/httpclient/session.rb', line 447 def socket_local @socket_local end |
#socket_sync ⇒ Object
Boolean value for Socket#sync
434 435 436 |
# File 'lib/httpclient/session.rb', line 434 def socket_sync @socket_sync end |
#ssl_config ⇒ Object
Returns the value of attribute ssl_config.
449 450 451 |
# File 'lib/httpclient/session.rb', line 449 def ssl_config @ssl_config end |
#ssl_peer_cert ⇒ Object (readonly)
Returns the value of attribute ssl_peer_cert.
450 451 452 |
# File 'lib/httpclient/session.rb', line 450 def ssl_peer_cert @ssl_peer_cert end |
#test_loopback_http_response ⇒ Object
Returns the value of attribute test_loopback_http_response.
451 452 453 |
# File 'lib/httpclient/session.rb', line 451 def test_loopback_http_response @test_loopback_http_response end |
#transparent_gzip_decompression ⇒ Object
Returns the value of attribute transparent_gzip_decompression.
453 454 455 |
# File 'lib/httpclient/session.rb', line 453 def transparent_gzip_decompression @transparent_gzip_decompression end |
Instance Method Details
#close ⇒ Object
529 530 531 532 533 534 535 536 |
# File 'lib/httpclient/session.rb', line 529 def close if !@socket.nil? and !@socket.closed? # @socket.flush may block when it the socket is already closed by # foreign host and the client runs under MT-condition. @socket.close end @state = :INIT end |
#closed? ⇒ Boolean
538 539 540 |
# File 'lib/httpclient/session.rb', line 538 def closed? @state == :INIT end |
#connect_ssl_proxy(socket, uri) ⇒ Object
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 |
# File 'lib/httpclient/session.rb', line 631 def connect_ssl_proxy(socket, uri) req = HTTP::Message.new_connect_request(uri) @client.request_filter.each do |filter| filter.filter_request(req) end set_header(req) req.dump(socket) socket.flush unless @socket_sync res = HTTP::Message.new_response('') parse_header(socket) res.http_version, res.status, res.reason = @version, @status, @reason @headers.each do |key, value| res.header.set(key.to_s, value) end commands = @client.request_filter.collect { |filter| filter.filter_response(req, res) } if commands.find { |command| command == :retry } raise RetryableResponse.new(res) end unless @status == 200 raise BadResponseError.new("connect to ssl proxy failed with status #{@status} #{@reason}", res) end end |
#create_loopback_socket(host, port, str) ⇒ Object
617 618 619 620 621 622 623 624 625 626 627 628 629 |
# File 'lib/httpclient/session.rb', line 617 def create_loopback_socket(host, port, str) @debug_dev << "! CONNECT TO #{host}:#{port}\n" if @debug_dev socket = LoopBackSocket.new(host, port, str) if @debug_dev @debug_dev << "! CONNECTION ESTABLISHED\n" socket.extend(DebugSocket) socket.debug_dev = @debug_dev end if https?(@dest) && @proxy connect_ssl_proxy(socket, Util.urify(@dest.to_s)) end socket end |
#create_socket(host, port) ⇒ Object
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 |
# File 'lib/httpclient/session.rb', line 591 def create_socket(host, port) socket = nil begin @debug_dev << "! CONNECT TO #{host}:#{port}\n" if @debug_dev clean_host = host.delete("[]") if @socket_local == Site::EMPTY socket = TCPSocket.new(clean_host, port) else clean_local = @socket_local.host.delete("[]") socket = TCPSocket.new(clean_host, port, clean_local, @socket_local.port) end if @debug_dev @debug_dev << "! CONNECTION ESTABLISHED\n" socket.extend(DebugSocket) socket.debug_dev = @debug_dev end rescue SystemCallError => e e. << " (#{host}:#{port})" raise rescue SocketError => e e. << " (#{host}:#{port})" raise end socket end |
#eof? ⇒ Boolean
555 556 557 558 559 560 561 |
# File 'lib/httpclient/session.rb', line 555 def eof? if !@content_length.nil? @content_length == 0 else @socket.closed? or @socket.eof? end end |
#get_body(&block) ⇒ Object
563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 |
# File 'lib/httpclient/session.rb', line 563 def get_body(&block) begin read_header if @state == :META return nil if @state != :DATA if @transparent_gzip_decompression block = content_inflater_block(@content_encoding, block) end if @chunked read_body_chunked(&block) elsif @content_length read_body_length(&block) else read_body_rest(&block) end rescue close raise end if eof? if @next_connection @state = :WAIT else close end end nil end |
#get_header ⇒ Object
542 543 544 545 546 547 548 549 550 551 552 553 |
# File 'lib/httpclient/session.rb', line 542 def get_header begin if @state != :META raise RuntimeError.new("get_status must be called at the beginning of a session") end read_header rescue close raise end [@version, @status, @reason, @headers] end |
#query(req) ⇒ Object
Send a request to the server
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 |
# File 'lib/httpclient/session.rb', line 496 def query(req) connect if @state == :INIT # Use absolute URI (not absolute path) iif via proxy AND not HTTPS. req.header.request_absolute_uri = !@proxy.nil? && !https?(@dest) begin ::Timeout.timeout(@send_timeout, SendTimeoutError) do set_header(req) req.dump(@socket) # flush the IO stream as IO::sync mode is false @socket.flush unless @socket_sync end rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE, IOError # JRuby can raise IOError instead of ECONNRESET for now close raise KeepAliveDisconnected.new(self, $!) rescue HTTPClient::TimeoutError close raise rescue => e close if SSLEnabled and e.is_a?(OpenSSL::SSL::SSLError) raise KeepAliveDisconnected.new(self, e) else raise end end @state = :META if @state == :WAIT @next_connection = nil @requests.push(req) @last_used = Time.now end |