Class: HTTPX::Request

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Callbacks
Defined in:
lib/httpx/request.rb

Direct Known Subclasses

Plugins::Proxy::HTTP::ConnectRequest

Defined Under Namespace

Classes: Body, ProcIO

Constant Summary collapse

METHODS =
[
  # RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1
  :options, :get, :head, :post, :put, :delete, :trace, :connect,

  # RFC 2518: HTTP Extensions for Distributed Authoring -- WEBDAV
  :propfind, :proppatch, :mkcol, :copy, :move, :lock, :unlock,

  # RFC 3648: WebDAV Ordered Collections Protocol
  :orderpatch,

  # RFC 3744: WebDAV Access Control Protocol
  :acl,

  # RFC 6352: vCard Extensions to WebDAV -- CardDAV
  :report,

  # RFC 5789: PATCH Method for HTTP
  :patch,

  # draft-reschke-webdav-search: WebDAV Search
  :search
].freeze
USER_AGENT =
"httpx.rb/#{VERSION}"

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Callbacks

#emit, #on, #once

Constructor Details

#initialize(verb, uri, options = {}) ⇒ Request

Returns a new instance of Request.

Raises:


48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/httpx/request.rb', line 48

def initialize(verb, uri, options = {})
  @verb    = verb.to_s.downcase.to_sym
  @uri     = URI(URI.escape(uri.to_s))
  @options = Options.new(options)

  raise(Error, "unknown method: #{verb}") unless METHODS.include?(@verb)

  @headers = @options.headers_class.new(@options.headers)
  @headers["user-agent"] ||= USER_AGENT
  @headers["accept"]     ||= "*/*"

  @body = @options.request_body_class.new(@headers, @options)
  @state = :idle
end

Instance Attribute Details

#bodyObject (readonly)

Returns the value of attribute body


36
37
38
# File 'lib/httpx/request.rb', line 36

def body
  @body
end

#headersObject (readonly)

Returns the value of attribute headers


36
37
38
# File 'lib/httpx/request.rb', line 36

def headers
  @headers
end

#optionsObject (readonly)

Returns the value of attribute options


38
39
40
# File 'lib/httpx/request.rb', line 38

def options
  @options
end

#responseObject

Returns the value of attribute response


38
39
40
# File 'lib/httpx/request.rb', line 38

def response
  @response
end

#stateObject (readonly)

Returns the value of attribute state


36
37
38
# File 'lib/httpx/request.rb', line 36

def state
  @state
end

#timerObject

Returns the value of attribute timer


40
41
42
# File 'lib/httpx/request.rb', line 40

def timer
  @timer
end

#uriObject (readonly)

Returns the value of attribute uri


36
37
38
# File 'lib/httpx/request.rb', line 36

def uri
  @uri
end

#verbObject (readonly)

Returns the value of attribute verb


36
37
38
# File 'lib/httpx/request.rb', line 36

def verb
  @verb
end

Instance Method Details

#authorityObject


86
87
88
# File 'lib/httpx/request.rb', line 86

def authority
  @uri.authority
end

#drain_bodyObject


106
107
108
109
110
111
112
113
114
# File 'lib/httpx/request.rb', line 106

def drain_body
  return nil if @body.nil?

  @drainer ||= @body.each
  chunk = @drainer.next
  chunk.dup
rescue StopIteration
  nil
end

#expects?Boolean

Returns:

  • (Boolean)

228
229
230
231
# File 'lib/httpx/request.rb', line 228

def expects?
  @headers["expect"] == "100-continue" &&
    @response && @response.status == 100
end

#inspectObject


116
117
118
# File 'lib/httpx/request.rb', line 116

def inspect
  "#<Request #{@verb.to_s.upcase} #{path} @headers=#{@headers.to_hash} @body=#{@body}>"
end

#merge_headers(h) ⇒ Object


63
64
65
# File 'lib/httpx/request.rb', line 63

def merge_headers(h)
  @headers = @headers.merge(h)
end

#originObject


91
92
93
# File 'lib/httpx/request.rb', line 91

def origin
  @uri.origin
end

#pathObject


78
79
80
81
82
83
# File 'lib/httpx/request.rb', line 78

def path
  path = uri.path.dup
  path << "/" if path.empty?
  path << "?#{query}" unless query.empty?
  path
end

#queryObject


95
96
97
98
99
100
101
102
103
104
# File 'lib/httpx/request.rb', line 95

def query
  return @query if defined?(@query)

  query = []
  if (q = @options.params)
    query << URI.encode_www_form(q)
  end
  query << @uri.query if @uri.query
  @query = query.join("&")
end

#schemeObject


67
68
69
# File 'lib/httpx/request.rb', line 67

def scheme
  @uri.scheme
end

#transition(nextstate) ⇒ Object


196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/httpx/request.rb', line 196

def transition(nextstate)
  case nextstate
  when :idle
    @response = nil
  when :headers
    return unless @state == :idle
  when :body
    return unless @state == :headers ||
                  @state == :expect

    if @headers.key?("expect")
      unless @response
        @state = :expect
        return
      end

      case @response.status
      when 100        # deallocate

        @response = nil
      when 417
        @response = @response
        return
      end
    end
  when :done
    return if @state == :expect
  end
  @state = nextstate
  nil
end