net-http 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/net/http.rb CHANGED
@@ -32,110 +32,237 @@ module Net #:nodoc:
32
32
  class HTTPHeaderSyntaxError < StandardError; end
33
33
  # :startdoc:
34
34
 
35
- # == An HTTP client API for Ruby.
35
+ # \Class \Net::HTTP provides a rich library that implements the client
36
+ # in a client-server model that uses the \HTTP request-response protocol.
37
+ # For information about \HTTP, see
38
+ #
39
+ # - {Hypertext Transfer Protocol}[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol].
40
+ # - {Technical overview}[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview].
41
+ #
42
+ # Note: If you are performing only a few GET requests, consider using
43
+ # {OpenURI}[https://docs.ruby-lang.org/en/master/OpenURI.html];
44
+ # otherwise, read on.
45
+ #
46
+ # == Synopsis
47
+ #
48
+ # If you are already familiar with \HTTP, this synopsis may be helpful.
49
+ #
50
+ # {Session}[rdoc-ref:Net::HTTP@Sessions] with multiple requests for
51
+ # {HTTP methods}[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods]:
52
+ #
53
+ # Net::HTTP.start(hostname) do |http|
54
+ # # Session started automatically before block execution.
55
+ # http.get(path_or_uri, headers = {})
56
+ # http.head(path_or_uri, headers = {})
57
+ # http.post(path_or_uri, data, headers = {}) # Can also have a block.
58
+ # http.put(path_or_uri, data, headers = {})
59
+ # http.delete(path_or_uri, headers = {Depth: 'Infinity'})
60
+ # http.options(path_or_uri, headers = {})
61
+ # http.trace(path_or_uri, headers = {})
62
+ # http.patch(path_or_uri, data, headers = {}) # Can also have a block.
63
+ # # Session finished automatically at block exit.
64
+ # end
36
65
  #
37
- # Net::HTTP provides a rich library which can be used to build HTTP
38
- # user-agents. For more details about HTTP see
39
- # [RFC2616](http://www.ietf.org/rfc/rfc2616.txt).
66
+ # {Session}[rdoc-ref:Net::HTTP@Sessions] with multiple requests for
67
+ # {WebDAV methods}[https://en.wikipedia.org/wiki/WebDAV#Implementation]:
68
+ #
69
+ # Net::HTTP.start(hostname) do |http|
70
+ # # Session started automatically before block execution.
71
+ # http.copy(path_or_uri, headers = {})
72
+ # http.lock(path_or_uri, body, headers = {})
73
+ # http.mkcol(path_or_uri, body = nil, headers = {})
74
+ # http.move(path_or_uri, headers = {})
75
+ # http.propfind(path_or_uri, body = nil, headers = {'Depth' => '0'})
76
+ # http.proppatch(path_or_uri, body, headers = {})
77
+ # http.unlock(path_or_uri, body, headers = {})
78
+ # # Session finished automatically at block exit.
79
+ # end
40
80
  #
41
- # Net::HTTP is designed to work closely with URI. URI::HTTP#host,
42
- # URI::HTTP#port and URI::HTTP#request_uri are designed to work with
43
- # Net::HTTP.
81
+ # Each of the following methods automatically starts and finishes
82
+ # a {session}[rdoc-ref:Net::HTTP@Sessions] that sends a single request:
44
83
  #
45
- # If you are only performing a few GET requests you should try OpenURI.
84
+ # # Return string response body.
85
+ # Net::HTTP.get(hostname, path, port = 80)
86
+ # Net::HTTP.get(uri, headers = {}, port = 80)
46
87
  #
47
- # == Simple Examples
88
+ # # Write string response body to $stdout.
89
+ # Net::HTTP.get_print(hostname, path_or_uri, port = 80)
90
+ # Net::HTTP.get_print(uri, headers = {}, port = 80)
48
91
  #
49
- # All examples assume you have loaded Net::HTTP with:
92
+ # # Return response as Net::HTTPResponse object.
93
+ # Net::HTTP.get_response(hostname, path_or_uri, port = 80)
94
+ # Net::HTTP.get_response(uri, headers = {}, port = 80)
50
95
  #
51
- # require 'net/http'
96
+ # Net::HTTP.post(uri, data, headers = {})
97
+ # Net::HTTP.post_form(uri, params)
52
98
  #
53
- # This will also require 'uri' so you don't need to require it separately.
99
+ # == About the Examples
54
100
  #
55
- # The Net::HTTP methods in the following section do not persist
56
- # connections. They are not recommended if you are performing many HTTP
57
- # requests.
101
+ # :include: doc/net-http/examples.rdoc
58
102
  #
59
- # === GET
103
+ # == URIs
60
104
  #
61
- # Net::HTTP.get('example.com', '/index.html') # => String
105
+ # On the internet, a URI
106
+ # ({Universal Resource Identifier}[https://en.wikipedia.org/wiki/Uniform_Resource_Identifier])
107
+ # is a string that identifies a particular resource.
108
+ # It consists of some or all of: scheme, hostname, path, query, and fragment;
109
+ # see {URI syntax}[https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax].
62
110
  #
63
- # === GET by URI
111
+ # A Ruby {URI::Generic}[https://docs.ruby-lang.org/en/master/URI/Generic.html] object
112
+ # represents an internet URI.
113
+ # It provides, among others, methods
114
+ # +scheme+, +hostname+, +path+, +query+, and +fragment+.
64
115
  #
65
- # uri = URI('http://example.com/index.html?count=10')
66
- # Net::HTTP.get(uri) # => String
116
+ # === Schemes
67
117
  #
68
- # === GET with Dynamic Parameters
118
+ # An internet \URI has
119
+ # a {scheme}[https://en.wikipedia.org/wiki/List_of_URI_schemes].
69
120
  #
70
- # uri = URI('http://example.com/index.html')
71
- # params = { :limit => 10, :page => 3 }
72
- # uri.query = URI.encode_www_form(params)
121
+ # The two schemes supported in \Net::HTTP are <tt>'https'</tt> and <tt>'http'</tt>:
73
122
  #
74
- # res = Net::HTTP.get_response(uri)
75
- # puts res.body if res.is_a?(Net::HTTPSuccess)
123
+ # uri.scheme # => "https"
124
+ # URI('http://example.com').scheme # => "http"
76
125
  #
77
- # === POST
126
+ # === Hostnames
78
127
  #
79
- # uri = URI('http://www.example.com/search.cgi')
80
- # res = Net::HTTP.post_form(uri, 'q' => 'ruby', 'max' => '50')
81
- # puts res.body
128
+ # A hostname identifies a server (host) to which requests may be sent:
82
129
  #
83
- # === POST with Multiple Values
130
+ # hostname = uri.hostname # => "jsonplaceholder.typicode.com"
131
+ # Net::HTTP.start(hostname) do |http|
132
+ # # Some HTTP stuff.
133
+ # end
84
134
  #
85
- # uri = URI('http://www.example.com/search.cgi')
86
- # res = Net::HTTP.post_form(uri, 'q' => ['ruby', 'perl'], 'max' => '50')
87
- # puts res.body
135
+ # === Paths
88
136
  #
89
- # == How to use Net::HTTP
137
+ # A host-specific path identifies a resource on the host:
90
138
  #
91
- # The following example code can be used as the basis of an HTTP user-agent
92
- # which can perform a variety of request types using persistent
93
- # connections.
139
+ # _uri = uri.dup
140
+ # _uri.path = '/todos/1'
141
+ # hostname = _uri.hostname
142
+ # path = _uri.path
143
+ # Net::HTTP.get(hostname, path)
94
144
  #
95
- # uri = URI('http://example.com/some_path?query=string')
145
+ # === Queries
96
146
  #
97
- # Net::HTTP.start(uri.host, uri.port) do |http|
98
- # request = Net::HTTP::Get.new uri
147
+ # A host-specific query adds name/value pairs to the URI:
99
148
  #
100
- # response = http.request request # Net::HTTPResponse object
101
- # end
149
+ # _uri = uri.dup
150
+ # params = {userId: 1, completed: false}
151
+ # _uri.query = URI.encode_www_form(params)
152
+ # _uri # => #<URI::HTTPS https://jsonplaceholder.typicode.com?userId=1&completed=false>
153
+ # Net::HTTP.get(_uri)
102
154
  #
103
- # Net::HTTP::start immediately creates a connection to an HTTP server which
104
- # is kept open for the duration of the block. The connection will remain
105
- # open for multiple requests in the block if the server indicates it
106
- # supports persistent connections.
155
+ # === Fragments
107
156
  #
108
- # If you wish to re-use a connection across multiple HTTP requests without
109
- # automatically closing it you can use ::new and then call #start and
110
- # #finish manually.
157
+ # A {URI fragment}[https://en.wikipedia.org/wiki/URI_fragment] has no effect
158
+ # in \Net::HTTP;
159
+ # the same data is returned, regardless of whether a fragment is included.
111
160
  #
112
- # The request types Net::HTTP supports are listed below in the section "HTTP
113
- # Request Classes".
161
+ # == Request Headers
114
162
  #
115
- # For all the Net::HTTP request objects and shortcut request methods you may
116
- # supply either a String for the request path or a URI from which Net::HTTP
117
- # will extract the request path.
163
+ # Request headers may be used to pass additional information to the host,
164
+ # similar to arguments passed in a method call;
165
+ # each header is a name/value pair.
118
166
  #
119
- # === Response Data
167
+ # Each of the \Net::HTTP methods that sends a request to the host
168
+ # has optional argument +headers+,
169
+ # where the headers are expressed as a hash of field-name/value pairs:
120
170
  #
121
- # uri = URI('http://example.com/index.html')
122
- # res = Net::HTTP.get_response(uri)
171
+ # headers = {Accept: 'application/json', Connection: 'Keep-Alive'}
172
+ # Net::HTTP.get(uri, headers)
123
173
  #
124
- # # Headers
125
- # res['Set-Cookie'] # => String
126
- # res.get_fields('set-cookie') # => Array
127
- # res.to_hash['set-cookie'] # => Array
128
- # puts "Headers: #{res.to_hash.inspect}"
174
+ # See lists of both standard request fields and common request fields at
175
+ # {Request Fields}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields].
176
+ # A host may also accept other custom fields.
129
177
  #
130
- # # Status
131
- # puts res.code # => '200'
132
- # puts res.message # => 'OK'
133
- # puts res.class.name # => 'HTTPOK'
178
+ # == Sessions
134
179
  #
135
- # # Body
136
- # puts res.body
180
+ # A _session_ is a connection between a server (host) and a client that:
181
+ #
182
+ # - Is begun by instance method Net::HTTP#start.
183
+ # - May contain any number of requests.
184
+ # - Is ended by instance method Net::HTTP#finish.
185
+ #
186
+ # See example sessions at the {Synopsis}[rdoc-ref:Net::HTTP@Synopsis].
187
+ #
188
+ # === Session Using \Net::HTTP.start
189
+ #
190
+ # If you have many requests to make to a single host (and port),
191
+ # consider using singleton method Net::HTTP.start with a block;
192
+ # the method handles the session automatically by:
193
+ #
194
+ # - Calling #start before block execution.
195
+ # - Executing the block.
196
+ # - Calling #finish after block execution.
197
+ #
198
+ # In the block, you can use these instance methods,
199
+ # each of which that sends a single request:
200
+ #
201
+ # - {HTTP methods}[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods]:
202
+ #
203
+ # - #get, #request_get: GET.
204
+ # - #head, #request_head: HEAD.
205
+ # - #post, #request_post: POST.
206
+ # - #delete: DELETE.
207
+ # - #options: OPTIONS.
208
+ # - #trace: TRACE.
209
+ # - #patch: PATCH.
210
+ #
211
+ # - {WebDAV methods}[https://en.wikipedia.org/wiki/WebDAV#Implementation]:
137
212
  #
138
- # === Following Redirection
213
+ # - #copy: COPY.
214
+ # - #lock: LOCK.
215
+ # - #mkcol: MKCOL.
216
+ # - #move: MOVE.
217
+ # - #propfind: PROPFIND.
218
+ # - #proppatch: PROPPATCH.
219
+ # - #unlock: UNLOCK.
220
+ #
221
+ # === Session Using \Net::HTTP.start and \Net::HTTP.finish
222
+ #
223
+ # You can manage a session manually using methods #start and #finish:
224
+ #
225
+ # http = Net::HTTP.new(hostname)
226
+ # http.start
227
+ # http.get('/todos/1')
228
+ # http.get('/todos/2')
229
+ # http.delete('/posts/1')
230
+ # http.finish # Needed to free resources.
231
+ #
232
+ # === Single-Request Session
233
+ #
234
+ # Certain convenience methods automatically handle a session by:
235
+ #
236
+ # - Creating an \HTTP object
237
+ # - Starting a session.
238
+ # - Sending a single request.
239
+ # - Finishing the session.
240
+ # - Destroying the object.
241
+ #
242
+ # Such methods that send GET requests:
243
+ #
244
+ # - ::get: Returns the string response body.
245
+ # - ::get_print: Writes the string response body to $stdout.
246
+ # - ::get_response: Returns a Net::HTTPResponse object.
247
+ #
248
+ # Such methods that send POST requests:
249
+ #
250
+ # - ::post: Posts data to the host.
251
+ # - ::post_form: Posts form data to the host.
252
+ #
253
+ # == \HTTP Requests and Responses
254
+ #
255
+ # Many of the methods above are convenience methods,
256
+ # each of which sends a request and returns a string
257
+ # without directly using \Net::HTTPRequest and \Net::HTTPResponse objects.
258
+ #
259
+ # You can, however, directly create a request object, send the request,
260
+ # and retrieve the response object; see:
261
+ #
262
+ # - Net::HTTPRequest.
263
+ # - Net::HTTPResponse.
264
+ #
265
+ # == Following Redirection
139
266
  #
140
267
  # Each Net::HTTPResponse object belongs to a class for its response code.
141
268
  #
@@ -167,56 +294,7 @@ module Net #:nodoc:
167
294
  #
168
295
  # print fetch('http://www.ruby-lang.org')
169
296
  #
170
- # === POST
171
- #
172
- # A POST can be made using the Net::HTTP::Post request class. This example
173
- # creates a URL encoded POST body:
174
- #
175
- # uri = URI('http://www.example.com/todo.cgi')
176
- # req = Net::HTTP::Post.new(uri)
177
- # req.set_form_data('from' => '2005-01-01', 'to' => '2005-03-31')
178
- #
179
- # res = Net::HTTP.start(uri.hostname, uri.port) do |http|
180
- # http.request(req)
181
- # end
182
- #
183
- # case res
184
- # when Net::HTTPSuccess, Net::HTTPRedirection
185
- # # OK
186
- # else
187
- # res.value
188
- # end
189
- #
190
- # To send multipart/form-data use Net::HTTPHeader#set_form:
191
- #
192
- # req = Net::HTTP::Post.new(uri)
193
- # req.set_form([['upload', File.open('foo.bar')]], 'multipart/form-data')
194
- #
195
- # Other requests that can contain a body such as PUT can be created in the
196
- # same way using the corresponding request class (Net::HTTP::Put).
197
- #
198
- # === Setting Headers
199
- #
200
- # The following example performs a conditional GET using the
201
- # If-Modified-Since header. If the files has not been modified since the
202
- # time in the header a Not Modified response will be returned. See RFC 2616
203
- # section 9.3 for further details.
204
- #
205
- # uri = URI('http://example.com/cached_response')
206
- # file = File.stat 'cached_response'
207
- #
208
- # req = Net::HTTP::Get.new(uri)
209
- # req['If-Modified-Since'] = file.mtime.rfc2822
210
- #
211
- # res = Net::HTTP.start(uri.hostname, uri.port) {|http|
212
- # http.request(req)
213
- # }
214
- #
215
- # open 'cached_response', 'w' do |io|
216
- # io.write res.body
217
- # end if res.is_a?(Net::HTTPSuccess)
218
- #
219
- # === Basic Authentication
297
+ # == Basic Authentication
220
298
  #
221
299
  # Basic authentication is performed according to
222
300
  # [RFC2617](http://www.ietf.org/rfc/rfc2617.txt).
@@ -231,7 +309,7 @@ module Net #:nodoc:
231
309
  # }
232
310
  # puts res.body
233
311
  #
234
- # === Streaming Response Bodies
312
+ # == Streaming Response Bodies
235
313
  #
236
314
  # By default Net::HTTP reads an entire response into memory. If you are
237
315
  # handling large files or wish to implement a progress bar you can instead
@@ -251,7 +329,7 @@ module Net #:nodoc:
251
329
  # end
252
330
  # end
253
331
  #
254
- # === HTTPS
332
+ # == HTTPS
255
333
  #
256
334
  # HTTPS is enabled for an HTTP connection by Net::HTTP#use_ssl=.
257
335
  #
@@ -272,7 +350,7 @@ module Net #:nodoc:
272
350
  # In previous versions of Ruby you would need to require 'net/https' to use
273
351
  # HTTPS. This is no longer true.
274
352
  #
275
- # === Proxies
353
+ # == Proxies
276
354
  #
277
355
  # Net::HTTP will automatically create a proxy from the +http_proxy+
278
356
  # environment variable if it is present. To disable use of +http_proxy+,
@@ -290,7 +368,7 @@ module Net #:nodoc:
290
368
  # See Net::HTTP.new for further details and examples such as proxies that
291
369
  # require a username and password.
292
370
  #
293
- # === Compression
371
+ # == Compression
294
372
  #
295
373
  # Net::HTTP automatically adds Accept-Encoding for compression of response
296
374
  # bodies and automatically decompresses gzip and deflate responses unless a
@@ -298,106 +376,10 @@ module Net #:nodoc:
298
376
  #
299
377
  # Compression can be disabled through the Accept-Encoding: identity header.
300
378
  #
301
- # == HTTP Request Classes
302
- #
303
- # Here is the HTTP request class hierarchy.
304
- #
305
- # * Net::HTTPRequest
306
- # * Net::HTTP::Get
307
- # * Net::HTTP::Head
308
- # * Net::HTTP::Post
309
- # * Net::HTTP::Patch
310
- # * Net::HTTP::Put
311
- # * Net::HTTP::Proppatch
312
- # * Net::HTTP::Lock
313
- # * Net::HTTP::Unlock
314
- # * Net::HTTP::Options
315
- # * Net::HTTP::Propfind
316
- # * Net::HTTP::Delete
317
- # * Net::HTTP::Move
318
- # * Net::HTTP::Copy
319
- # * Net::HTTP::Mkcol
320
- # * Net::HTTP::Trace
321
- #
322
- # == HTTP Response Classes
323
- #
324
- # Here is HTTP response class hierarchy. All classes are defined in Net
325
- # module and are subclasses of Net::HTTPResponse.
326
- #
327
- # HTTPUnknownResponse:: For unhandled HTTP extensions
328
- # HTTPInformation:: 1xx
329
- # HTTPContinue:: 100
330
- # HTTPSwitchProtocol:: 101
331
- # HTTPProcessing:: 102
332
- # HTTPEarlyHints:: 103
333
- # HTTPSuccess:: 2xx
334
- # HTTPOK:: 200
335
- # HTTPCreated:: 201
336
- # HTTPAccepted:: 202
337
- # HTTPNonAuthoritativeInformation:: 203
338
- # HTTPNoContent:: 204
339
- # HTTPResetContent:: 205
340
- # HTTPPartialContent:: 206
341
- # HTTPMultiStatus:: 207
342
- # HTTPAlreadyReported:: 208
343
- # HTTPIMUsed:: 226
344
- # HTTPRedirection:: 3xx
345
- # HTTPMultipleChoices:: 300
346
- # HTTPMovedPermanently:: 301
347
- # HTTPFound:: 302
348
- # HTTPSeeOther:: 303
349
- # HTTPNotModified:: 304
350
- # HTTPUseProxy:: 305
351
- # HTTPTemporaryRedirect:: 307
352
- # HTTPPermanentRedirect:: 308
353
- # HTTPClientError:: 4xx
354
- # HTTPBadRequest:: 400
355
- # HTTPUnauthorized:: 401
356
- # HTTPPaymentRequired:: 402
357
- # HTTPForbidden:: 403
358
- # HTTPNotFound:: 404
359
- # HTTPMethodNotAllowed:: 405
360
- # HTTPNotAcceptable:: 406
361
- # HTTPProxyAuthenticationRequired:: 407
362
- # HTTPRequestTimeOut:: 408
363
- # HTTPConflict:: 409
364
- # HTTPGone:: 410
365
- # HTTPLengthRequired:: 411
366
- # HTTPPreconditionFailed:: 412
367
- # HTTPRequestEntityTooLarge:: 413
368
- # HTTPRequestURITooLong:: 414
369
- # HTTPUnsupportedMediaType:: 415
370
- # HTTPRequestedRangeNotSatisfiable:: 416
371
- # HTTPExpectationFailed:: 417
372
- # HTTPMisdirectedRequest:: 421
373
- # HTTPUnprocessableEntity:: 422
374
- # HTTPLocked:: 423
375
- # HTTPFailedDependency:: 424
376
- # HTTPUpgradeRequired:: 426
377
- # HTTPPreconditionRequired:: 428
378
- # HTTPTooManyRequests:: 429
379
- # HTTPRequestHeaderFieldsTooLarge:: 431
380
- # HTTPUnavailableForLegalReasons:: 451
381
- # HTTPServerError:: 5xx
382
- # HTTPInternalServerError:: 500
383
- # HTTPNotImplemented:: 501
384
- # HTTPBadGateway:: 502
385
- # HTTPServiceUnavailable:: 503
386
- # HTTPGatewayTimeOut:: 504
387
- # HTTPVersionNotSupported:: 505
388
- # HTTPVariantAlsoNegotiates:: 506
389
- # HTTPInsufficientStorage:: 507
390
- # HTTPLoopDetected:: 508
391
- # HTTPNotExtended:: 510
392
- # HTTPNetworkAuthenticationRequired:: 511
393
- #
394
- # There is also the Net::HTTPBadResponse exception which is raised when
395
- # there is a protocol error.
396
- #
397
379
  class HTTP < Protocol
398
380
 
399
381
  # :stopdoc:
400
- VERSION = "0.3.0"
382
+ VERSION = "0.3.2"
401
383
  Revision = %q$Revision$.split[1]
402
384
  HTTPVersion = '1.1'
403
385
  begin
@@ -408,18 +390,17 @@ module Net #:nodoc:
408
390
  end
409
391
  # :startdoc:
410
392
 
411
- # Turns on net/http 1.2 (Ruby 1.8) features.
412
- # Defaults to ON in Ruby 1.8 or later.
393
+ # Returns +true+; retained for compatibility.
413
394
  def HTTP.version_1_2
414
395
  true
415
396
  end
416
397
 
417
- # Returns true if net/http is in version 1.2 mode.
418
- # Defaults to true.
398
+ # Returns +true+; retained for compatibility.
419
399
  def HTTP.version_1_2?
420
400
  true
421
401
  end
422
402
 
403
+ # Returns +false+; retained for compatibility.
423
404
  def HTTP.version_1_1? #:nodoc:
424
405
  false
425
406
  end
@@ -429,25 +410,12 @@ module Net #:nodoc:
429
410
  alias is_version_1_2? version_1_2? #:nodoc:
430
411
  end
431
412
 
413
+ # :call-seq:
414
+ # Net::HTTP.get_print(hostname, path, port = 80) -> nil
415
+ # Net::HTTP:get_print(uri, headers = {}, port = uri.port) -> nil
432
416
  #
433
- # short cut methods
434
- #
435
-
436
- #
437
- # Gets the body text from the target and outputs it to $stdout. The
438
- # target can either be specified as
439
- # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
440
- #
441
- # Net::HTTP.get_print URI('http://www.example.com/index.html')
442
- #
443
- # or:
444
- #
445
- # Net::HTTP.get_print 'www.example.com', '/index.html'
446
- #
447
- # you can also specify request headers:
448
- #
449
- # Net::HTTP.get_print URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }
450
- #
417
+ # Like Net::HTTP.get, but writes the returned body to $stdout;
418
+ # returns +nil+.
451
419
  def HTTP.get_print(uri_or_host, path_or_headers = nil, port = nil)
452
420
  get_response(uri_or_host, path_or_headers, port) {|res|
453
421
  res.read_body do |chunk|
@@ -457,40 +425,48 @@ module Net #:nodoc:
457
425
  nil
458
426
  end
459
427
 
460
- # Sends a GET request to the target and returns the HTTP response
461
- # as a string. The target can either be specified as
462
- # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
428
+ # :call-seq:
429
+ # Net::HTTP.get(hostname, path, port = 80) -> body
430
+ # Net::HTTP:get(uri, headers = {}, port = uri.port) -> body
463
431
  #
464
- # print Net::HTTP.get(URI('http://www.example.com/index.html'))
432
+ # Sends a GET request and returns the \HTTP response body as a string.
465
433
  #
466
- # or:
434
+ # With string arguments +hostname+ and +path+:
467
435
  #
468
- # print Net::HTTP.get('www.example.com', '/index.html')
436
+ # hostname = 'jsonplaceholder.typicode.com'
437
+ # path = '/todos/1'
438
+ # puts Net::HTTP.get(hostname, path)
469
439
  #
470
- # you can also specify request headers:
440
+ # Output:
471
441
  #
472
- # Net::HTTP.get(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
442
+ # {
443
+ # "userId": 1,
444
+ # "id": 1,
445
+ # "title": "delectus aut autem",
446
+ # "completed": false
447
+ # }
473
448
  #
474
- def HTTP.get(uri_or_host, path_or_headers = nil, port = nil)
475
- get_response(uri_or_host, path_or_headers, port).body
476
- end
477
-
478
- # Sends a GET request to the target and returns the HTTP response
479
- # as a Net::HTTPResponse object. The target can either be specified as
480
- # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
449
+ # With URI object +uri+ and optional hash argument +headers+:
481
450
  #
482
- # res = Net::HTTP.get_response(URI('http://www.example.com/index.html'))
483
- # print res.body
451
+ # uri = URI('https://jsonplaceholder.typicode.com/todos/1')
452
+ # headers = {'Content-type' => 'application/json; charset=UTF-8'}
453
+ # Net::HTTP.get(uri, headers)
484
454
  #
485
- # or:
455
+ # Related:
486
456
  #
487
- # res = Net::HTTP.get_response('www.example.com', '/index.html')
488
- # print res.body
457
+ # - Net::HTTP::Get: request class for \HTTP method +GET+.
458
+ # - Net::HTTP#get: convenience method for \HTTP method +GET+.
489
459
  #
490
- # you can also specify request headers:
491
- #
492
- # Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
460
+ def HTTP.get(uri_or_host, path_or_headers = nil, port = nil)
461
+ get_response(uri_or_host, path_or_headers, port).body
462
+ end
463
+
464
+ # :call-seq:
465
+ # Net::HTTP.get_response(hostname, path, port = 80) -> http_response
466
+ # Net::HTTP:get_response(uri, headers = {}, port = uri.port) -> http_response
493
467
  #
468
+ # Like Net::HTTP.get, but returns a Net::HTTPResponse object
469
+ # instead of the body string.
494
470
  def HTTP.get_response(uri_or_host, path_or_headers = nil, port = nil, &block)
495
471
  if path_or_headers && !path_or_headers.is_a?(Hash)
496
472
  host = uri_or_host
@@ -508,16 +484,31 @@ module Net #:nodoc:
508
484
  end
509
485
  end
510
486
 
511
- # Posts data to the specified URI object.
487
+ # Posts data to a host; returns a Net::HTTPResponse object.
512
488
  #
513
- # Example:
489
+ # Argument +url+ must be a URL;
490
+ # argument +data+ must be a string:
491
+ #
492
+ # _uri = uri.dup
493
+ # _uri.path = '/posts'
494
+ # data = '{"title": "foo", "body": "bar", "userId": 1}'
495
+ # headers = {'content-type': 'application/json'}
496
+ # res = Net::HTTP.post(_uri, data, headers) # => #<Net::HTTPCreated 201 Created readbody=true>
497
+ # puts res.body
498
+ #
499
+ # Output:
514
500
  #
515
- # require 'net/http'
516
- # require 'uri'
501
+ # {
502
+ # "title": "foo",
503
+ # "body": "bar",
504
+ # "userId": 1,
505
+ # "id": 101
506
+ # }
517
507
  #
518
- # Net::HTTP.post URI('http://www.example.com/api/search'),
519
- # { "q" => "ruby", "max" => "50" }.to_json,
520
- # "Content-Type" => "application/json"
508
+ # Related:
509
+ #
510
+ # - Net::HTTP::Post: request class for \HTTP method +POST+.
511
+ # - Net::HTTP#post: convenience method for \HTTP method +POST+.
521
512
  #
522
513
  def HTTP.post(url, data, header = nil)
523
514
  start(url.hostname, url.port,
@@ -526,22 +517,25 @@ module Net #:nodoc:
526
517
  }
527
518
  end
528
519
 
529
- # Posts HTML form data to the specified URI object.
530
- # The form data must be provided as a Hash mapping from String to String.
531
- # Example:
520
+ # Posts data to a host; returns a Net::HTTPResponse object.
532
521
  #
533
- # { "cmd" => "search", "q" => "ruby", "max" => "50" }
522
+ # Argument +url+ must be a URI;
523
+ # argument +data+ must be a hash:
534
524
  #
535
- # This method also does Basic Authentication if and only if +url+.user exists.
536
- # But userinfo for authentication is deprecated (RFC3986).
537
- # So this feature will be removed.
525
+ # _uri = uri.dup
526
+ # _uri.path = '/posts'
527
+ # data = {title: 'foo', body: 'bar', userId: 1}
528
+ # res = Net::HTTP.post_form(_uri, data) # => #<Net::HTTPCreated 201 Created readbody=true>
529
+ # puts res.body
538
530
  #
539
- # Example:
540
- #
541
- # require 'net/http'
531
+ # Output:
542
532
  #
543
- # Net::HTTP.post_form URI('http://www.example.com/search.cgi'),
544
- # { "q" => "ruby", "max" => "50" }
533
+ # {
534
+ # "title": "foo",
535
+ # "body": "bar",
536
+ # "userId": "1",
537
+ # "id": 101
538
+ # }
545
539
  #
546
540
  def HTTP.post_form(url, params)
547
541
  req = Post.new(url)
@@ -557,17 +551,26 @@ module Net #:nodoc:
557
551
  # HTTP session management
558
552
  #
559
553
 
560
- # The default port to use for HTTP requests; defaults to 80.
554
+ # Returns intger +80+, the default port to use for HTTP requests:
555
+ #
556
+ # Net::HTTP.default_port # => 80
557
+ #
561
558
  def HTTP.default_port
562
559
  http_default_port()
563
560
  end
564
561
 
565
- # The default port to use for HTTP requests; defaults to 80.
562
+ # Returns integer +80+, the default port to use for HTTP requests:
563
+ #
564
+ # Net::HTTP.http_default_port # => 80
565
+ #
566
566
  def HTTP.http_default_port
567
567
  80
568
568
  end
569
569
 
570
- # The default port to use for HTTPS requests; defaults to 443.
570
+ # Returns integer +443+, the default port to use for HTTPS requests:
571
+ #
572
+ # Net::HTTP.https_default_port # => 443
573
+ #
571
574
  def HTTP.https_default_port
572
575
  443
573
576
  end
@@ -577,35 +580,91 @@ module Net #:nodoc:
577
580
  end
578
581
 
579
582
  # :call-seq:
580
- # HTTP.start(address, port, p_addr, p_port, p_user, p_pass, &block)
581
- # HTTP.start(address, port=nil, p_addr=:ENV, p_port=nil, p_user=nil, p_pass=nil, opt, &block)
582
- #
583
- # Creates a new Net::HTTP object, then additionally opens the TCP
584
- # connection and HTTP session.
585
- #
586
- # Arguments are the following:
587
- # _address_ :: hostname or IP address of the server
588
- # _port_ :: port of the server
589
- # _p_addr_ :: address of proxy
590
- # _p_port_ :: port of proxy
591
- # _p_user_ :: user of proxy
592
- # _p_pass_ :: pass of proxy
593
- # _opt_ :: optional hash
594
- #
595
- # _opt_ sets following values by its accessor.
596
- # The keys are ipaddr, ca_file, ca_path, cert, cert_store, ciphers, keep_alive_timeout,
597
- # close_on_empty_response, key, open_timeout, read_timeout, write_timeout, ssl_timeout,
598
- # ssl_version, use_ssl, verify_callback, verify_depth and verify_mode.
599
- # If you set :use_ssl as true, you can use https and default value of
600
- # verify_mode is set as OpenSSL::SSL::VERIFY_PEER.
601
- #
602
- # If the optional block is given, the newly
603
- # created Net::HTTP object is passed to it and closed when the
604
- # block finishes. In this case, the return value of this method
605
- # is the return value of the block. If no block is given, the
606
- # return value of this method is the newly created Net::HTTP object
607
- # itself, and the caller is responsible for closing it upon completion
608
- # using the finish() method.
583
+ # HTTP.start(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil, opts) -> http
584
+ # HTTP.start(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil, opts) {|http| ... } -> object
585
+ #
586
+ # Creates a new \Net::HTTP object, +http+, via \Net::HTTP.new:
587
+ #
588
+ # Net::HTTP.new(address, port, p_addr, p_port, p_user, p_pass)
589
+ #
590
+ # - For arguments +hostname+ through +p_pass+, see Net::HTTP.new.
591
+ # - For argument +opts+, see below.
592
+ #
593
+ # Note: If +port+ is +nil+ and <tt>opts[:use_ssl]</tt> is a truthy value,
594
+ # the value passed to +new+ is Net::HTTP.https_default_port, not +port+.
595
+ #
596
+ # With no block given:
597
+ #
598
+ # - Calls <tt>http.start</tt> with no block (see #start),
599
+ # which opens a TCP connection and \HTTP session.
600
+ # - Returns +http+.
601
+ # - The caller should call #finish to close the session:
602
+ #
603
+ # http = Net::HTTP.start(hostname)
604
+ # http.started? # => true
605
+ # http.finish
606
+ # http.started? # => false
607
+ #
608
+ # With a block given:
609
+ #
610
+ # - Calls <tt>http.start</tt> with the block (see #start), which:
611
+ #
612
+ # - Opens a TCP connection and \HTTP session.
613
+ # - Calls the block,
614
+ # which may make any number of requests to the host.
615
+ # - Closes the \HTTP session and TCP connection on block exit.
616
+ # - Returns the block's value +object+.
617
+ #
618
+ # - Returns +object+.
619
+ #
620
+ # Example:
621
+ #
622
+ # hostname = 'jsonplaceholder.typicode.com'
623
+ # Net::HTTP.start(hostname) do |http|
624
+ # puts http.get('/todos/1').body
625
+ # puts http.get('/todos/2').body
626
+ # end
627
+ #
628
+ # Output:
629
+ #
630
+ # {
631
+ # "userId": 1,
632
+ # "id": 1,
633
+ # "title": "delectus aut autem",
634
+ # "completed": false
635
+ # }
636
+ # {
637
+ # "userId": 1,
638
+ # "id": 2,
639
+ # "title": "quis ut nam facilis et officia qui",
640
+ # "completed": false
641
+ # }
642
+ #
643
+ # If the last argument given is a hash, it is the +opts+ hash,
644
+ # where each key is a method or accessor to be called,
645
+ # and its value is the value to be set.
646
+ #
647
+ # The keys may include:
648
+ #
649
+ # - #ca_file
650
+ # - #ca_path
651
+ # - #cert
652
+ # - #cert_store
653
+ # - #ciphers
654
+ # - #close_on_empty_response
655
+ # - +ipaddr+ (calls #ipaddr=)
656
+ # - #keep_alive_timeout
657
+ # - #key
658
+ # - #open_timeout
659
+ # - #read_timeout
660
+ # - #ssl_timeout
661
+ # - #ssl_version
662
+ # - +use_ssl+ (calls #use_ssl=)
663
+ # - #verify_callback
664
+ # - #verify_depth
665
+ # - #verify_mode
666
+ # - #write_timeout
667
+ #
609
668
  def HTTP.start(address, *arg, &block) # :yield: +http+
610
669
  arg.pop if opt = Hash.try_convert(arg[-1])
611
670
  port, p_addr, p_port, p_user, p_pass = *arg
@@ -632,25 +691,113 @@ module Net #:nodoc:
632
691
  alias newobj new # :nodoc:
633
692
  end
634
693
 
635
- # Creates a new Net::HTTP object without opening a TCP connection or
636
- # HTTP session.
694
+ # Returns a new Net::HTTP object +http+
695
+ # (but does not open a TCP connection or HTTP session).
696
+ #
697
+ # <b>No Proxy</b>
698
+ #
699
+ # With only string argument +hostname+ given
700
+ # (and <tt>ENV['http_proxy']</tt> undefined or +nil+),
701
+ # the returned +http+:
702
+ #
703
+ # - Has the given address.
704
+ # - Has the default port number, Net::HTTP.default_port (80).
705
+ # - Has no proxy.
706
+ #
707
+ # Example:
708
+ #
709
+ # http = Net::HTTP.new(hostname)
710
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:80 open=false>
711
+ # http.address # => "jsonplaceholder.typicode.com"
712
+ # http.port # => 80
713
+ # http.proxy? # => false
714
+ #
715
+ # With integer argument +port+ also given,
716
+ # the returned +http+ has the given port:
717
+ #
718
+ # http = Net::HTTP.new(hostname, 8000)
719
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:8000 open=false>
720
+ # http.port # => 8000
721
+ #
722
+ # <b>Proxy Using Argument +p_addr+ as a \String</b>
723
+ #
724
+ # When argument +p_addr+ is a string hostname,
725
+ # the returned +http+ has a proxy:
726
+ #
727
+ # http = Net::HTTP.new(hostname, nil, 'proxy.example')
728
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:80 open=false>
729
+ # http.proxy? # => true
730
+ # http.proxy_address # => "proxy.example"
731
+ # # These use default values.
732
+ # http.proxy_port # => 80
733
+ # http.proxy_user # => nil
734
+ # http.proxy_pass # => nil
735
+ #
736
+ # The port, username, and password for the proxy may also be given:
737
+ #
738
+ # http = Net::HTTP.new(hostname, nil, 'proxy.example', 8000, 'pname', 'ppass')
739
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:80 open=false>
740
+ # http.proxy? # => true
741
+ # http.proxy_address # => "proxy.example"
742
+ # http.proxy_port # => 8000
743
+ # http.proxy_user # => "pname"
744
+ # http.proxy_pass # => "ppass"
745
+ #
746
+ # <b>Proxy Using <tt>ENV['http_proxy']</tt></b>
747
+ #
748
+ # When environment variable <tt>'http_proxy'</tt>
749
+ # is set to a \URI string,
750
+ # the returned +http+ will have that URI as its proxy;
751
+ # note that the \URI string must have a protocol
752
+ # such as <tt>'http'</tt> or <tt>'https'</tt>:
753
+ #
754
+ # ENV['http_proxy'] = 'http://example.com'
755
+ # # => "http://example.com"
756
+ # http = Net::HTTP.new(hostname)
757
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:80 open=false>
758
+ # http.proxy? # => true
759
+ # http.address # => "jsonplaceholder.typicode.com"
760
+ # http.proxy_address # => "example.com"
761
+ #
762
+ # The \URI string may include proxy username, password, and port number:
763
+ #
764
+ # ENV['http_proxy'] = 'http://pname:ppass@example.com:8000'
765
+ # # => "http://pname:ppass@example.com:8000"
766
+ # http = Net::HTTP.new(hostname)
767
+ # # => #<Net::HTTP jsonplaceholder.typicode.com:80 open=false>
768
+ # http.proxy_port # => 8000
769
+ # http.proxy_user # => "pname"
770
+ # http.proxy_pass # => "ppass"
637
771
  #
638
- # The +address+ should be a DNS hostname or IP address, the +port+ is the
639
- # port the server operates on. If no +port+ is given the default port for
640
- # HTTP or HTTPS is used.
772
+ # <b>Argument +p_no_proxy+</b>
641
773
  #
642
- # If none of the +p_+ arguments are given, the proxy host and port are
643
- # taken from the +http_proxy+ environment variable (or its uppercase
644
- # equivalent) if present. If the proxy requires authentication you must
645
- # supply it by hand. See URI::Generic#find_proxy for details of proxy
646
- # detection from the environment. To disable proxy detection set +p_addr+
647
- # to nil.
774
+ # You can use argument +p_no_proxy+ to reject certain proxies:
648
775
  #
649
- # If you are connecting to a custom proxy, +p_addr+ specifies the DNS name
650
- # or IP address of the proxy host, +p_port+ the port to use to access the
651
- # proxy, +p_user+ and +p_pass+ the username and password if authorization
652
- # is required to use the proxy, and p_no_proxy hosts which do not
653
- # use the proxy.
776
+ # - Reject a certain address:
777
+ #
778
+ # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example')
779
+ # http.proxy_address # => nil
780
+ #
781
+ # - Reject certain domains or subdomains:
782
+ #
783
+ # http = Net::HTTP.new('example.com', nil, 'my.proxy.example', 8000, 'pname', 'ppass', 'proxy.example')
784
+ # http.proxy_address # => nil
785
+ #
786
+ # - Reject certain addresses and port combinations:
787
+ #
788
+ # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example:1234')
789
+ # http.proxy_address # => "proxy.example"
790
+ #
791
+ # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'proxy.example:8000')
792
+ # http.proxy_address # => nil
793
+ #
794
+ # - Reject a list of the types above delimited using a comma:
795
+ #
796
+ # http = Net::HTTP.new('example.com', nil, 'proxy.example', 8000, 'pname', 'ppass', 'my.proxy,proxy.example:8000')
797
+ # http.proxy_address # => nil
798
+ #
799
+ # http = Net::HTTP.new('example.com', nil, 'my.proxy', 8000, 'pname', 'ppass', 'my.proxy,proxy.example:8000')
800
+ # http.proxy_address # => nil
654
801
  #
655
802
  def HTTP.new(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil, p_no_proxy = nil)
656
803
  http = super address, port
@@ -717,6 +864,11 @@ module Net #:nodoc:
717
864
  end
718
865
  end
719
866
 
867
+ # Returns a string representation of +self+:
868
+ #
869
+ # Net::HTTP.new(hostname).inspect
870
+ # # => "#<Net::HTTP jsonplaceholder.typicode.com:80 open=false>"
871
+ #
720
872
  def inspect
721
873
  "#<#{self.class} #{@address}:#{@port} open=#{started?}>"
722
874
  end
@@ -724,11 +876,51 @@ module Net #:nodoc:
724
876
  # *WARNING* This method opens a serious security hole.
725
877
  # Never use this method in production code.
726
878
  #
727
- # Sets an output stream for debugging.
879
+ # Sets the output stream for debugging:
728
880
  #
729
881
  # http = Net::HTTP.new(hostname)
730
- # http.set_debug_output $stderr
731
- # http.start { .... }
882
+ # File.open('t.tmp', 'w') do |file|
883
+ # http.set_debug_output(file)
884
+ # http.start
885
+ # http.get('/nosuch/1')
886
+ # http.finish
887
+ # end
888
+ # puts File.read('t.tmp')
889
+ #
890
+ # Output:
891
+ #
892
+ # opening connection to jsonplaceholder.typicode.com:80...
893
+ # opened
894
+ # <- "GET /nosuch/1 HTTP/1.1\r\nAccept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3\r\nAccept: */*\r\nUser-Agent: Ruby\r\nHost: jsonplaceholder.typicode.com\r\n\r\n"
895
+ # -> "HTTP/1.1 404 Not Found\r\n"
896
+ # -> "Date: Mon, 12 Dec 2022 21:14:11 GMT\r\n"
897
+ # -> "Content-Type: application/json; charset=utf-8\r\n"
898
+ # -> "Content-Length: 2\r\n"
899
+ # -> "Connection: keep-alive\r\n"
900
+ # -> "X-Powered-By: Express\r\n"
901
+ # -> "X-Ratelimit-Limit: 1000\r\n"
902
+ # -> "X-Ratelimit-Remaining: 999\r\n"
903
+ # -> "X-Ratelimit-Reset: 1670879660\r\n"
904
+ # -> "Vary: Origin, Accept-Encoding\r\n"
905
+ # -> "Access-Control-Allow-Credentials: true\r\n"
906
+ # -> "Cache-Control: max-age=43200\r\n"
907
+ # -> "Pragma: no-cache\r\n"
908
+ # -> "Expires: -1\r\n"
909
+ # -> "X-Content-Type-Options: nosniff\r\n"
910
+ # -> "Etag: W/\"2-vyGp6PvFo4RvsFtPoIWeCReyIC8\"\r\n"
911
+ # -> "Via: 1.1 vegur\r\n"
912
+ # -> "CF-Cache-Status: MISS\r\n"
913
+ # -> "Server-Timing: cf-q-config;dur=1.3000000762986e-05\r\n"
914
+ # -> "Report-To: {\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=yOr40jo%2BwS1KHzhTlVpl54beJ5Wx2FcG4gGV0XVrh3X9OlR5q4drUn2dkt5DGO4GDcE%2BVXT7CNgJvGs%2BZleIyMu8CLieFiDIvOviOY3EhHg94m0ZNZgrEdpKD0S85S507l1vsEwEHkoTm%2Ff19SiO\"}],\"group\":\"cf-nel\",\"max_age\":604800}\r\n"
915
+ # -> "NEL: {\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}\r\n"
916
+ # -> "Server: cloudflare\r\n"
917
+ # -> "CF-RAY: 778977dc484ce591-DFW\r\n"
918
+ # -> "alt-svc: h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400\r\n"
919
+ # -> "\r\n"
920
+ # reading 2 bytes...
921
+ # -> "{}"
922
+ # read 2 bytes
923
+ # Conn keep-alive
732
924
  #
733
925
  def set_debug_output(output)
734
926
  warn 'Net::HTTP#set_debug_output called after HTTP started', uplevel: 1 if started?
@@ -752,8 +944,24 @@ module Net #:nodoc:
752
944
  # body encoding.
753
945
  attr_reader :response_body_encoding
754
946
 
755
- # Set the encoding to use for the response body. If given a String, find
756
- # the related Encoding.
947
+ # Sets the encoding to be used for the response body;
948
+ # returns the encoding.
949
+ #
950
+ # The given +value+ may be:
951
+ #
952
+ # - An Encoding object.
953
+ # - The name of an encoding.
954
+ # - An alias for an encoding name.
955
+ #
956
+ # See {Encoding}[https://docs.ruby-lang.org/en/master/Encoding.html].
957
+ #
958
+ # Examples:
959
+ #
960
+ # http = Net::HTTP.new(hostname)
961
+ # http.response_body_encoding = Encoding::US_ASCII # => #<Encoding:US-ASCII>
962
+ # http.response_body_encoding = 'US-ASCII' # => "US-ASCII"
963
+ # http.response_body_encoding = 'ASCII' # => "ASCII"
964
+ #
757
965
  def response_body_encoding=(value)
758
966
  value = Encoding.find(value) if value.is_a?(String)
759
967
  @response_body_encoding = value
@@ -765,12 +973,37 @@ module Net #:nodoc:
765
973
  attr_writer :proxy_user
766
974
  attr_writer :proxy_pass
767
975
 
768
- # The IP address to connect to/used to connect to
976
+ # Returns the IP address for the connection.
977
+ #
978
+ # If the session has not been started,
979
+ # returns the value set by #ipaddr=,
980
+ # or +nil+ if it has not been set:
981
+ #
982
+ # http = Net::HTTP.new(hostname)
983
+ # http.ipaddr # => nil
984
+ # http.ipaddr = '172.67.155.76'
985
+ # http.ipaddr # => "172.67.155.76"
986
+ #
987
+ # If the session has been started,
988
+ # returns the IP address from the socket:
989
+ #
990
+ # http = Net::HTTP.new(hostname)
991
+ # http.start
992
+ # http.ipaddr # => "172.67.155.76"
993
+ # http.finish
994
+ #
769
995
  def ipaddr
770
996
  started? ? @socket.io.peeraddr[3] : @ipaddr
771
997
  end
772
998
 
773
- # Set the IP address to connect to
999
+ # Sets the IP address for the connection:
1000
+ #
1001
+ # http = Net::HTTP.new(hostname)
1002
+ # http.ipaddr # => nil
1003
+ # http.ipaddr = '172.67.155.76'
1004
+ # http.ipaddr # => "172.67.155.76"
1005
+ #
1006
+ # The IP address may not be set if the session has been started.
774
1007
  def ipaddr=(addr)
775
1008
  raise IOError, "ipaddr value changed, but session already started" if started?
776
1009
  @ipaddr = addr
@@ -795,12 +1028,18 @@ module Net #:nodoc:
795
1028
  # Net::WriteTimeout is not raised on Windows.
796
1029
  attr_reader :write_timeout
797
1030
 
798
- # Maximum number of times to retry an idempotent request in case of
1031
+ # Sets the maximum number of times to retry an idempotent request in case of
799
1032
  # Net::ReadTimeout, IOError, EOFError, Errno::ECONNRESET,
800
1033
  # Errno::ECONNABORTED, Errno::EPIPE, OpenSSL::SSL::SSLError,
801
1034
  # Timeout::Error.
802
- # Should be a non-negative integer number. Zero means no retries.
803
- # The default value is 1.
1035
+ # The initial value is 1.
1036
+ #
1037
+ # Argument +retries+ must be a non-negative numeric value:
1038
+ #
1039
+ # http = Net::HTTP.new(hostname)
1040
+ # http.max_retries = 2 # => 2
1041
+ # http.max_retries # => 2
1042
+ #
804
1043
  def max_retries=(retries)
805
1044
  retries = retries.to_int
806
1045
  if retries < 0
@@ -811,13 +1050,27 @@ module Net #:nodoc:
811
1050
 
812
1051
  attr_reader :max_retries
813
1052
 
814
- # Setter for the read_timeout attribute.
1053
+ # Sets the read timeout, in seconds, for +self+ to integer +sec+;
1054
+ # the initial value is 60.
1055
+ #
1056
+ # Argument +sec+ must be a non-negative numeric value:
1057
+ #
1058
+ # http = Net::HTTP.new(hostname)
1059
+ # http.read_timeout # => 60
1060
+ # http.get('/todos/1') # => #<Net::HTTPOK 200 OK readbody=true>
1061
+ # http.read_timeout = 0
1062
+ # http.get('/todos/1') # Raises Net::ReadTimeout.
1063
+ #
815
1064
  def read_timeout=(sec)
816
1065
  @socket.read_timeout = sec if @socket
817
1066
  @read_timeout = sec
818
1067
  end
819
1068
 
820
- # Setter for the write_timeout attribute.
1069
+ # Sets the write timeout, in seconds, for +self+ to integer +sec+;
1070
+ # the initial value is 60.
1071
+ #
1072
+ # Argument +sec+ must be a non-negative numeric value.
1073
+ #
821
1074
  def write_timeout=(sec)
822
1075
  @socket.write_timeout = sec if @socket
823
1076
  @write_timeout = sec
@@ -1144,7 +1397,7 @@ module Net #:nodoc:
1144
1397
  #
1145
1398
  # This class is obsolete. You may pass these same parameters directly to
1146
1399
  # Net::HTTP.new. See Net::HTTP.new for details of the arguments.
1147
- def HTTP.Proxy(p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil)
1400
+ def HTTP.Proxy(p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil) #:nodoc:
1148
1401
  return self unless p_addr
1149
1402
 
1150
1403
  Class.new(self) {