net-http 0.2.2 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,16 +1,186 @@
1
1
  # frozen_string_literal: false
2
- # The HTTPHeader module defines methods for reading and writing
3
- # HTTP headers.
4
2
  #
5
- # It is used as a mixin by other classes, to provide hash-like
6
- # access to HTTP header values. Unlike raw hash access, HTTPHeader
7
- # provides access via case-insensitive keys. It also provides
8
- # methods for accessing commonly-used HTTP header values in more
9
- # convenient formats.
3
+ # The \HTTPHeader module provides access to \HTTP headers.
4
+ #
5
+ # The module is included in:
6
+ #
7
+ # - Net::HTTPGenericRequest (and therefore Net::HTTPRequest).
8
+ # - Net::HTTPResponse.
9
+ #
10
+ # The headers are a hash-like collection of key/value pairs called _fields_.
11
+ #
12
+ # == Request and Response Fields
13
+ #
14
+ # Headers may be included in:
15
+ #
16
+ # - A Net::HTTPRequest object:
17
+ # the object's headers will be sent with the request.
18
+ # Any fields may be defined in the request;
19
+ # see {Setters}[rdoc-ref:Net::HTTPHeader@Setters].
20
+ # - A Net::HTTPResponse object:
21
+ # the objects headers are usually those returned from the host.
22
+ # Fields may be retrieved from the object;
23
+ # see {Getters}[rdoc-ref:Net::HTTPHeader@Getters]
24
+ # and {Iterators}[rdoc-ref:Net::HTTPHeader@Iterators].
25
+ #
26
+ # Exactly which fields should be sent or expected depends on the host;
27
+ # see:
28
+ #
29
+ # - {Request fields}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields].
30
+ # - {Response fields}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields].
31
+ #
32
+ # == About the Examples
33
+ #
34
+ # :include: doc/net-http/examples.rdoc
35
+ #
36
+ # == Fields
37
+ #
38
+ # A header field is a key/value pair.
39
+ #
40
+ # === Field Keys
41
+ #
42
+ # A field key may be:
43
+ #
44
+ # - A string: Key <tt>'Accept'</tt> is treated as if it were
45
+ # <tt>'Accept'.downcase</tt>; i.e., <tt>'accept'</tt>.
46
+ # - A symbol: Key <tt>:Accept</tt> is treated as if it were
47
+ # <tt>:Accept.to_s.downcase</tt>; i.e., <tt>'accept'</tt>.
48
+ #
49
+ # Examples:
50
+ #
51
+ # req = Net::HTTP::Get.new(uri)
52
+ # req[:accept] # => "*/*"
53
+ # req['Accept'] # => "*/*"
54
+ # req['ACCEPT'] # => "*/*"
55
+ #
56
+ # req['accept'] = 'text/html'
57
+ # req[:accept] = 'text/html'
58
+ # req['ACCEPT'] = 'text/html'
59
+ #
60
+ # === Field Values
61
+ #
62
+ # A field value may be returned as an array of strings or as a string:
63
+ #
64
+ # - These methods return field values as arrays:
65
+ #
66
+ # - #get_fields: Returns the array value for the given key,
67
+ # or +nil+ if it does not exist.
68
+ # - #to_hash: Returns a hash of all header fields:
69
+ # each key is a field name; its value is the array value for the field.
70
+ #
71
+ # - These methods return field values as string;
72
+ # the string value for a field is equivalent to
73
+ # <tt>self[key.downcase.to_s].join(', '))</tt>:
74
+ #
75
+ # - #[]: Returns the string value for the given key,
76
+ # or +nil+ if it does not exist.
77
+ # - #fetch: Like #[], but accepts a default value
78
+ # to be returned if the key does not exist.
79
+ #
80
+ # The field value may be set:
81
+ #
82
+ # - #[]=: Sets the value for the given key;
83
+ # the given value may be a string, a symbol, an array, or a hash.
84
+ # - #add_field: Adds a given value to a value for the given key
85
+ # (not overwriting the existing value).
86
+ # - #delete: Deletes the field for the given key.
87
+ #
88
+ # Example field values:
89
+ #
90
+ # - \String:
91
+ #
92
+ # req['Accept'] = 'text/html' # => "text/html"
93
+ # req['Accept'] # => "text/html"
94
+ # req.get_fields('Accept') # => ["text/html"]
95
+ #
96
+ # - \Symbol:
97
+ #
98
+ # req['Accept'] = :text # => :text
99
+ # req['Accept'] # => "text"
100
+ # req.get_fields('Accept') # => ["text"]
101
+ #
102
+ # - Simple array:
103
+ #
104
+ # req[:foo] = %w[bar baz bat]
105
+ # req[:foo] # => "bar, baz, bat"
106
+ # req.get_fields(:foo) # => ["bar", "baz", "bat"]
107
+ #
108
+ # - Simple hash:
109
+ #
110
+ # req[:foo] = {bar: 0, baz: 1, bat: 2}
111
+ # req[:foo] # => "bar, 0, baz, 1, bat, 2"
112
+ # req.get_fields(:foo) # => ["bar", "0", "baz", "1", "bat", "2"]
113
+ #
114
+ # - Nested:
115
+ #
116
+ # req[:foo] = [%w[bar baz], {bat: 0, bam: 1}]
117
+ # req[:foo] # => "bar, baz, bat, 0, bam, 1"
118
+ # req.get_fields(:foo) # => ["bar", "baz", "bat", "0", "bam", "1"]
119
+ #
120
+ # req[:foo] = {bar: %w[baz bat], bam: {bah: 0, bad: 1}}
121
+ # req[:foo] # => "bar, baz, bat, bam, bah, 0, bad, 1"
122
+ # req.get_fields(:foo) # => ["bar", "baz", "bat", "bam", "bah", "0", "bad", "1"]
123
+ #
124
+ # == Convenience Methods
125
+ #
126
+ # Various convenience methods retrieve values, set values, query values,
127
+ # set form values, or iterate over fields.
128
+ #
129
+ # === Setters
130
+ #
131
+ # \Method #[]= can set any field, but does little to validate the new value;
132
+ # some of the other setter methods provide some validation:
133
+ #
134
+ # - #[]=: Sets the string or array value for the given key.
135
+ # - #add_field: Creates or adds to the array value for the given key.
136
+ # - #basic_auth: Sets the string authorization header for <tt>'Authorization'</tt>.
137
+ # - #content_length=: Sets the integer length for field <tt>'Content-Length</tt>.
138
+ # - #content_type=: Sets the string value for field <tt>'Content-Type'</tt>.
139
+ # - #proxy_basic_auth: Sets the string authorization header for <tt>'Proxy-Authorization'</tt>.
140
+ # - #set_range: Sets the value for field <tt>'Range'</tt>.
141
+ #
142
+ # === Form Setters
143
+ #
144
+ # - #set_form: Sets an HTML form data set.
145
+ # - #set_form_data: Sets header fields and a body from HTML form data.
146
+ #
147
+ # === Getters
148
+ #
149
+ # \Method #[] can retrieve the value of any field that exists,
150
+ # but always as a string;
151
+ # some of the other getter methods return something different
152
+ # from the simple string value:
153
+ #
154
+ # - #[]: Returns the string field value for the given key.
155
+ # - #content_length: Returns the integer value of field <tt>'Content-Length'</tt>.
156
+ # - #content_range: Returns the Range value of field <tt>'Content-Range'</tt>.
157
+ # - #content_type: Returns the string value of field <tt>'Content-Type'</tt>.
158
+ # - #fetch: Returns the string field value for the given key.
159
+ # - #get_fields: Returns the array field value for the given +key+.
160
+ # - #main_type: Returns first part of the string value of field <tt>'Content-Type'</tt>.
161
+ # - #sub_type: Returns second part of the string value of field <tt>'Content-Type'</tt>.
162
+ # - #range: Returns an array of Range objects of field <tt>'Range'</tt>, or +nil+.
163
+ # - #range_length: Returns the integer length of the range given in field <tt>'Content-Range'</tt>.
164
+ # - #type_params: Returns the string parameters for <tt>'Content-Type'</tt>.
165
+ #
166
+ # === Queries
167
+ #
168
+ # - #chunked?: Returns whether field <tt>'Transfer-Encoding'</tt> is set to <tt>'chunked'</tt>.
169
+ # - #connection_close?: Returns whether field <tt>'Connection'</tt> is set to <tt>'close'</tt>.
170
+ # - #connection_keep_alive?: Returns whether field <tt>'Connection'</tt> is set to <tt>'keep-alive'</tt>.
171
+ # - #key?: Returns whether a given key exists.
172
+ #
173
+ # === Iterators
174
+ #
175
+ # - #each_capitalized: Passes each field capitalized-name/value pair to the block.
176
+ # - #each_capitalized_name: Passes each capitalized field name to the block.
177
+ # - #each_header: Passes each field name/value pair to the block.
178
+ # - #each_name: Passes each field name to the block.
179
+ # - #each_value: Passes each string field value to the block.
10
180
  #
11
181
  module Net::HTTPHeader
12
182
 
13
- def initialize_http_header(initheader)
183
+ def initialize_http_header(initheader) #:nodoc:
14
184
  @header = {}
15
185
  return unless initheader
16
186
  initheader.each do |key, value|
@@ -33,14 +203,34 @@ module Net::HTTPHeader
33
203
 
34
204
  alias length size #:nodoc: obsolete
35
205
 
36
- # Returns the header field corresponding to the case-insensitive key.
37
- # For example, a key of "Content-Type" might return "text/html"
206
+ # Returns the string field value for the case-insensitive field +key+,
207
+ # or +nil+ if there is no such key;
208
+ # see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]:
209
+ #
210
+ # res = Net::HTTP.start(hostname) do |http|
211
+ # http.get('/todos/1')
212
+ # end
213
+ # res['Connection'] # => "keep-alive"
214
+ # res['Nosuch'] # => nil
215
+ #
216
+ # Note that some field values may be retrieved via convenience methods;
217
+ # see {Getters}[rdoc-ref:Net::HTTPHeader@Getters].
38
218
  def [](key)
39
219
  a = @header[key.downcase.to_s] or return nil
40
220
  a.join(', ')
41
221
  end
42
222
 
43
- # Sets the header field corresponding to the case-insensitive key.
223
+ # Sets the value for the case-insensitive +key+ to +val+,
224
+ # overwriting the previous value if the field exists;
225
+ # see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]:
226
+ #
227
+ # req = Net::HTTP::Get.new(uri)
228
+ # req['Accept'] # => "*/*"
229
+ # req['Accept'] = 'text/html'
230
+ # req['Accept'] # => "text/html"
231
+ #
232
+ # Note that some field values may be set via convenience methods;
233
+ # see {Setters}[rdoc-ref:Net::HTTPHeader@Setters].
44
234
  def []=(key, val)
45
235
  unless val
46
236
  @header.delete key.downcase.to_s
@@ -49,20 +239,18 @@ module Net::HTTPHeader
49
239
  set_field(key, val)
50
240
  end
51
241
 
52
- # [Ruby 1.8.3]
53
- # Adds a value to a named header field, instead of replacing its value.
54
- # Second argument +val+ must be a String.
55
- # See also #[]=, #[] and #get_fields.
242
+ # Adds value +val+ to the value array for field +key+ if the field exists;
243
+ # creates the field with the given +key+ and +val+ if it does not exist.
244
+ # see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]:
56
245
  #
57
- # request.add_field 'X-My-Header', 'a'
58
- # p request['X-My-Header'] #=> "a"
59
- # p request.get_fields('X-My-Header') #=> ["a"]
60
- # request.add_field 'X-My-Header', 'b'
61
- # p request['X-My-Header'] #=> "a, b"
62
- # p request.get_fields('X-My-Header') #=> ["a", "b"]
63
- # request.add_field 'X-My-Header', 'c'
64
- # p request['X-My-Header'] #=> "a, b, c"
65
- # p request.get_fields('X-My-Header') #=> ["a", "b", "c"]
246
+ # req = Net::HTTP::Get.new(uri)
247
+ # req.add_field('Foo', 'bar')
248
+ # req['Foo'] # => "bar"
249
+ # req.add_field('Foo', 'baz')
250
+ # req['Foo'] # => "bar, baz"
251
+ # req.add_field('Foo', %w[baz bam])
252
+ # req['Foo'] # => "bar, baz, baz, bam"
253
+ # req.get_fields('Foo') # => ["bar", "baz", "baz", "bam"]
66
254
  #
67
255
  def add_field(key, val)
68
256
  stringified_downcased_key = key.downcase.to_s
@@ -101,16 +289,15 @@ module Net::HTTPHeader
101
289
  end
102
290
  end
103
291
 
104
- # [Ruby 1.8.3]
105
- # Returns an array of header field strings corresponding to the
106
- # case-insensitive +key+. This method allows you to get duplicated
107
- # header fields without any processing. See also #[].
292
+ # Returns the array field value for the given +key+,
293
+ # or +nil+ if there is no such field;
294
+ # see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]:
108
295
  #
109
- # p response.get_fields('Set-Cookie')
110
- # #=> ["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23",
111
- # "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"]
112
- # p response['Set-Cookie']
113
- # #=> "session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"
296
+ # res = Net::HTTP.start(hostname) do |http|
297
+ # http.get('/todos/1')
298
+ # end
299
+ # res.get_fields('Connection') # => ["keep-alive"]
300
+ # res.get_fields('Nosuch') # => nil
114
301
  #
115
302
  def get_fields(key)
116
303
  stringified_downcased_key = key.downcase.to_s
@@ -118,24 +305,62 @@ module Net::HTTPHeader
118
305
  @header[stringified_downcased_key].dup
119
306
  end
120
307
 
121
- # Returns the header field corresponding to the case-insensitive key.
122
- # Returns the default value +args+, or the result of the block, or
123
- # raises an IndexError if there's no header field named +key+
124
- # See Hash#fetch
308
+ # :call-seq
309
+ # fetch(key, default_val = nil) {|key| ... } -> object
310
+ # fetch(key, default_val = nil) -> value or default_val
311
+ #
312
+ # With a block, returns the string value for +key+ if it exists;
313
+ # otherwise returns the value of the block;
314
+ # ignores the +default_val+;
315
+ # see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]:
316
+ #
317
+ # res = Net::HTTP.start(hostname) do |http|
318
+ # http.get('/todos/1')
319
+ # end
320
+ #
321
+ # # Field exists; block not called.
322
+ # res.fetch('Connection') do |value|
323
+ # fail 'Cannot happen'
324
+ # end # => "keep-alive"
325
+ #
326
+ # # Field does not exist; block called.
327
+ # res.fetch('Nosuch') do |value|
328
+ # value.downcase
329
+ # end # => "nosuch"
330
+ #
331
+ # With no block, returns the string value for +key+ if it exists;
332
+ # otherwise, returns +default_val+ if it was given;
333
+ # otherwise raises an exception:
334
+ #
335
+ # res.fetch('Connection', 'Foo') # => "keep-alive"
336
+ # res.fetch('Nosuch', 'Foo') # => "Foo"
337
+ # res.fetch('Nosuch') # Raises KeyError.
338
+ #
125
339
  def fetch(key, *args, &block) #:yield: +key+
126
340
  a = @header.fetch(key.downcase.to_s, *args, &block)
127
341
  a.kind_of?(Array) ? a.join(', ') : a
128
342
  end
129
343
 
130
- # Iterates through the header names and values, passing in the name
131
- # and value to the code block supplied.
344
+ # Calls the block with each key/value pair:
132
345
  #
133
- # Returns an enumerator if no block is given.
346
+ # res = Net::HTTP.start(hostname) do |http|
347
+ # http.get('/todos/1')
348
+ # end
349
+ # res.each_header do |key, value|
350
+ # p [key, value] if key.start_with?('c')
351
+ # end
134
352
  #
135
- # Example:
353
+ # Output:
354
+ #
355
+ # ["content-type", "application/json; charset=utf-8"]
356
+ # ["connection", "keep-alive"]
357
+ # ["cache-control", "max-age=43200"]
358
+ # ["cf-cache-status", "HIT"]
359
+ # ["cf-ray", "771d17e9bc542cf5-ORD"]
136
360
  #
137
- # response.header.each_header {|key,value| puts "#{key} = #{value}" }
361
+ # Returns an enumerator if no block is given.
138
362
  #
363
+ # Net::HTTPHeader#each is an alias for Net::HTTPHeader#each_header.
139
364
  def each_header #:yield: +key+, +value+
140
365
  block_given? or return enum_for(__method__) { @header.size }
141
366
  @header.each do |k,va|
@@ -145,10 +370,26 @@ module Net::HTTPHeader
145
370
 
146
371
  alias each each_header
147
372
 
148
- # Iterates through the header names in the header, passing
149
- # each header name to the code block.
373
+ # Calls the block with each field key:
374
+ #
375
+ # res = Net::HTTP.start(hostname) do |http|
376
+ # http.get('/todos/1')
377
+ # end
378
+ # res.each_key do |key|
379
+ # p key if key.start_with?('c')
380
+ # end
381
+ #
382
+ # Output:
383
+ #
384
+ # "content-type"
385
+ # "connection"
386
+ # "cache-control"
387
+ # "cf-cache-status"
388
+ # "cf-ray"
150
389
  #
151
390
  # Returns an enumerator if no block is given.
391
+ #
392
+ # Net::HTTPHeader#each_name is an alias for Net::HTTPHeader#each_key.
152
393
  def each_name(&block) #:yield: +key+
153
394
  block_given? or return enum_for(__method__) { @header.size }
154
395
  @header.each_key(&block)
@@ -156,12 +397,25 @@ module Net::HTTPHeader
156
397
 
157
398
  alias each_key each_name
158
399
 
159
- # Iterates through the header names in the header, passing
160
- # capitalized header names to the code block.
400
+ # Calls the block with each capitalized field name:
401
+ #
402
+ # res = Net::HTTP.start(hostname) do |http|
403
+ # http.get('/todos/1')
404
+ # end
405
+ # res.each_capitalized_name do |key|
406
+ # p key if key.start_with?('C')
407
+ # end
161
408
  #
162
- # Note that header names are capitalized systematically;
163
- # capitalization may not match that used by the remote HTTP
164
- # server in its response.
409
+ # Output:
410
+ #
411
+ # "Content-Type"
412
+ # "Connection"
413
+ # "Cache-Control"
414
+ # "Cf-Cache-Status"
415
+ # "Cf-Ray"
416
+ #
417
+ # The capitalization is system-dependent;
418
+ # see {Case Mapping}[https://docs.ruby-lang.org/en/master/case_mapping_rdoc.html].
165
419
  #
166
420
  # Returns an enumerator if no block is given.
167
421
  def each_capitalized_name #:yield: +key+
@@ -171,8 +425,20 @@ module Net::HTTPHeader
171
425
  end
172
426
  end
173
427
 
174
- # Iterates through header values, passing each value to the
175
- # code block.
428
+ # Calls the block with each string field value:
429
+ #
430
+ # res = Net::HTTP.start(hostname) do |http|
431
+ # http.get('/todos/1')
432
+ # end
433
+ # res.each_value do |value|
434
+ # p value if value.start_with?('c')
435
+ # end
436
+ #
437
+ # Output:
438
+ #
439
+ # "chunked"
440
+ # "cf-q-config;dur=6.0000002122251e-06"
441
+ # "cloudflare"
176
442
  #
177
443
  # Returns an enumerator if no block is given.
178
444
  def each_value #:yield: +value+
@@ -182,32 +448,45 @@ module Net::HTTPHeader
182
448
  end
183
449
  end
184
450
 
185
- # Removes a header field, specified by case-insensitive key.
451
+ # Removes the header for the given case-insensitive +key+
452
+ # (see {Fields}[rdoc-ref:Net::HTTPHeader@Fields]);
453
+ # returns the deleted value, or +nil+ if no such field exists:
454
+ #
455
+ # req = Net::HTTP::Get.new(uri)
456
+ # req.delete('Accept') # => ["*/*"]
457
+ # req.delete('Nosuch') # => nil
458
+ #
186
459
  def delete(key)
187
460
  @header.delete(key.downcase.to_s)
188
461
  end
189
462
 
190
- # true if +key+ header exists.
463
+ # Returns +true+ if the field for the case-insensitive +key+ exists, +false+ otherwise:
464
+ #
465
+ # req = Net::HTTP::Get.new(uri)
466
+ # req.key?('Accept') # => true
467
+ # req.key?('Nosuch') # => false
468
+ #
191
469
  def key?(key)
192
470
  @header.key?(key.downcase.to_s)
193
471
  end
194
472
 
195
- # Returns a Hash consisting of header names and array of values.
196
- # e.g.
197
- # {"cache-control" => ["private"],
198
- # "content-type" => ["text/html"],
199
- # "date" => ["Wed, 22 Jun 2005 22:11:50 GMT"]}
473
+ # Returns a hash of the key/value pairs:
474
+ #
475
+ # req = Net::HTTP::Get.new(uri)
476
+ # req.to_hash
477
+ # # =>
478
+ # {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"],
479
+ # "accept"=>["*/*"],
480
+ # "user-agent"=>["Ruby"],
481
+ # "host"=>["jsonplaceholder.typicode.com"]}
482
+ #
200
483
  def to_hash
201
484
  @header.dup
202
485
  end
203
486
 
204
- # As for #each_header, except the keys are provided in capitalized form.
205
- #
206
- # Note that header names are capitalized systematically;
207
- # capitalization may not match that used by the remote HTTP
208
- # server in its response.
487
+ # Like #each_header, but the keys are returned in capitalized form.
209
488
  #
210
- # Returns an enumerator if no block is given.
489
+ # Net::HTTPHeader#canonical_each is an alias for Net::HTTPHeader#each_capitalized.
211
490
  def each_capitalized
212
491
  block_given? or return enum_for(__method__) { @header.size }
213
492
  @header.each do |k,v|
@@ -222,8 +501,17 @@ module Net::HTTPHeader
222
501
  end
223
502
  private :capitalize
224
503
 
225
- # Returns an Array of Range objects which represent the Range:
226
- # HTTP header field, or +nil+ if there is no such header.
504
+ # Returns an array of Range objects that represent
505
+ # the value of field <tt>'Range'</tt>,
506
+ # or +nil+ if there is no such field;
507
+ # see {Range request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request-header]:
508
+ #
509
+ # req = Net::HTTP::Get.new(uri)
510
+ # req['Range'] = 'bytes=0-99,200-299,400-499'
511
+ # req.range # => [0..99, 200..299, 400..499]
512
+ # req.delete('Range')
513
+ # req.range # # => nil
514
+ #
227
515
  def range
228
516
  return nil unless @header['range']
229
517
 
@@ -266,14 +554,31 @@ module Net::HTTPHeader
266
554
  result
267
555
  end
268
556
 
269
- # Sets the HTTP Range: header.
270
- # Accepts either a Range object as a single argument,
271
- # or a beginning index and a length from that index.
272
- # Example:
557
+ # :call-seq:
558
+ # set_range(length) -> length
559
+ # set_range(offset, length) -> range
560
+ # set_range(begin..length) -> range
561
+ #
562
+ # Sets the value for field <tt>'Range'</tt>;
563
+ # see {Range request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request-header]:
564
+ #
565
+ # With argument +length+:
273
566
  #
274
- # req.range = (0..1023)
275
- # req.set_range 0, 1023
567
+ # req = Net::HTTP::Get.new(uri)
568
+ # req.set_range(100) # => 100
569
+ # req['Range'] # => "bytes=0-99"
276
570
  #
571
+ # With arguments +offset+ and +length+:
572
+ #
573
+ # req.set_range(100, 100) # => 100...200
574
+ # req['Range'] # => "bytes=100-199"
575
+ #
576
+ # With argument +range+:
577
+ #
578
+ # req.set_range(100..199) # => 100..199
579
+ # req['Range'] # => "bytes=100-199"
580
+ #
581
+ # Net::HTTPHeader#range= is an alias for Net::HTTPHeader#set_range.
277
582
  def set_range(r, e = nil)
278
583
  unless r
279
584
  @header.delete 'range'
@@ -338,9 +643,10 @@ module Net::HTTPHeader
338
643
  # fits inside the full entity body, as range of byte offsets.
339
644
  def content_range
340
645
  return nil unless @header['content-range']
341
- m = %r<bytes\s+(\d+)-(\d+)/(\d+|\*)>i.match(self['Content-Range']) or
646
+ m = %r<\A\s*(\w+)\s+(\d+)-(\d+)/(\d+|\*)>.match(self['Content-Range']) or
342
647
  raise Net::HTTPHeaderSyntaxError, 'wrong Content-Range format'
343
- m[1].to_i .. m[2].to_i
648
+ return unless m[1] == 'bytes'
649
+ m[2].to_i .. m[3].to_i
344
650
  end
345
651
 
346
652
  # The length of the range represented in Content-Range: header.
@@ -393,7 +699,9 @@ module Net::HTTPHeader
393
699
  # Sets the content type in an HTTP header.
394
700
  # The +type+ should be a full HTTP content type, e.g. "text/html".
395
701
  # The +params+ are an optional Hash of parameters to add after the
396
- # content type, e.g. {'charset' => 'iso-8859-1'}
702
+ # content type, e.g. {'charset' => 'iso-8859-1'}.
703
+ #
704
+ # Net::HTTPHeader#content_type= is an alias for Net::HTTPHeader#set_content_type.
397
705
  def set_content_type(type, params = {})
398
706
  @header['content-type'] = [type + params.map{|k,v|"; #{k}=#{v}"}.join('')]
399
707
  end
@@ -413,6 +721,7 @@ module Net::HTTPHeader
413
721
  # http.form_data = {"q" => ["ruby", "perl"], "lang" => "en"}
414
722
  # http.set_form_data({"q" => "ruby", "lang" => "en"}, ';')
415
723
  #
724
+ # Net::HTTPHeader#form_data= is an alias for Net::HTTPHeader#set_form_data.
416
725
  def set_form_data(params, sep = '&')
417
726
  query = URI.encode_www_form(params)
418
727
  query.gsub!(/&/, sep) if sep != '&'
@@ -1,8 +1,31 @@
1
1
  # frozen_string_literal: false
2
- # HTTP request class.
3
- # This class wraps together the request header and the request path.
4
- # You cannot use this class directly. Instead, you should use one of its
5
- # subclasses: Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Head.
2
+
3
+ # This class is the base class for \Net::HTTP request classes;
4
+ # it wraps together the request path and the request headers.
5
+ #
6
+ # The class should not be used directly;
7
+ # instead you should use its subclasses.
8
+ #
9
+ # Subclasses for HTTP requests:
10
+ #
11
+ # - Net::HTTP::Get
12
+ # - Net::HTTP::Head
13
+ # - Net::HTTP::Post
14
+ # - Net::HTTP::Put
15
+ # - Net::HTTP::Delete
16
+ # - Net::HTTP::Options
17
+ # - Net::HTTP::Trace
18
+ # - Net::HTTP::Patch
19
+ #
20
+ # Subclasses for WebDAV requests:
21
+ #
22
+ # - Net::HTTP::Propfind
23
+ # - Net::HTTP::Proppatch
24
+ # - Net::HTTP::Mkcol
25
+ # - Net::HTTP::Copy
26
+ # - Net::HTTP::Move
27
+ # - Net::HTTP::Lock
28
+ # - Net::HTTP::Unlock
6
29
  #
7
30
  class Net::HTTPRequest < Net::HTTPGenericRequest
8
31
  # Creates an HTTP request object for +path+.
@@ -18,4 +41,3 @@ class Net::HTTPRequest < Net::HTTPGenericRequest
18
41
  path, initheader
19
42
  end
20
43
  end
21
-