Class: Async::HTTP::Protocol::HTTP1::Client

Inherits:
Connection
  • Object
show all
Defined in:
lib/async/http/protocol/http1/client.rb

Instance Attribute Summary

Attributes inherited from Connection

#count, #version

Instance Method Summary collapse

Methods inherited from Connection

#close, #connected?, #hijack, #initialize, #multiplex, #peer, #read_chunked_body, #read_fixed_body, #read_line, #read_remainder_body, #read_tunnel_body, #reusable?

Constructor Details

This class inherits a constructor from Async::HTTP::Protocol::HTTP1::Connection

Instance Method Details

#call(request, task: Task.current) ⇒ Object

Used by the client to send requests to the remote server.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/async/http/protocol/http1/client.rb', line 29

def call(request, task: Task.current)
  Async.logger.debug(self) {"#{request.method} #{request.path} #{request.headers.inspect}"}
  
  # We carefully interpret https://tools.ietf.org/html/rfc7230#section-6.3.1 to implement this correctly.
  begin
    self.write_request(request.authority, request.method, request.path, self.version, request.headers)
  rescue
    # If we fail to fully write the request and body, we can retry this request.
    raise RequestFailed.new
  end
  
  if request.body?
    task.async do
      # Once we start writing the body, we can't recover if the request fails. That's because the body might be generated dynamically, streaming, etc.
      self.write_body(request.body)
    end
  else
    self.write_empty_body(request.body)
  end
  
  # This won't return the response until the entire body is written.
  return Response.new(self, request)
rescue
  # This will ensure that #reusable? returns false.
  @stream.close
  
  raise
end