rest-client 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.mailmap +10 -0
  4. data/.rubocop +2 -0
  5. data/.rubocop-disables.yml +46 -44
  6. data/.rubocop.yml +5 -0
  7. data/.travis.yml +31 -17
  8. data/AUTHORS +8 -0
  9. data/README.md +126 -9
  10. data/Rakefile +12 -4
  11. data/history.md +53 -0
  12. data/lib/restclient.rb +0 -1
  13. data/lib/restclient/abstract_response.rb +28 -2
  14. data/lib/restclient/exceptions.rb +3 -3
  15. data/lib/restclient/payload.rb +29 -4
  16. data/lib/restclient/raw_response.rb +17 -6
  17. data/lib/restclient/request.rb +94 -67
  18. data/lib/restclient/resource.rb +16 -6
  19. data/lib/restclient/response.rb +14 -4
  20. data/lib/restclient/utils.rb +47 -8
  21. data/lib/restclient/version.rb +2 -2
  22. data/rest-client.gemspec +3 -2
  23. data/spec/ISS.jpg +0 -0
  24. data/spec/helpers.rb +37 -5
  25. data/spec/integration/capath_digicert/3513523f.0 +22 -0
  26. data/spec/integration/capath_digicert/399e7759.0 +22 -0
  27. data/spec/integration/capath_digicert/digicert.crt +20 -17
  28. data/spec/integration/certs/digicert.crt +20 -17
  29. data/spec/integration/httpbin_spec.rb +41 -0
  30. data/spec/integration/integration_spec.rb +0 -7
  31. data/spec/unit/abstract_response_spec.rb +7 -7
  32. data/spec/unit/payload_spec.rb +51 -19
  33. data/spec/unit/raw_response_spec.rb +6 -2
  34. data/spec/unit/request2_spec.rb +8 -8
  35. data/spec/unit/request_spec.rb +53 -65
  36. data/spec/unit/resource_spec.rb +7 -7
  37. data/spec/unit/response_spec.rb +33 -22
  38. data/spec/unit/restclient_spec.rb +3 -2
  39. data/spec/unit/utils_spec.rb +10 -10
  40. metadata +34 -13
  41. data/spec/integration/capath_digicert/244b5494.0 +0 -19
  42. data/spec/integration/capath_digicert/81b9768f.0 +0 -19
  43. data/spec/unit/master_shake.jpg +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 10312217af6f5a0312bdce748c8fd82f428fce64
4
- data.tar.gz: 67846732a7926b335a7082eb1fba0b7178f0c5c4
2
+ SHA256:
3
+ metadata.gz: e61fb064d966989b00da05fc3e16e3c389cebb68de302d1436e9e2be10dbef8c
4
+ data.tar.gz: fa5deab3c8c4a44e2d5478e212dd24221d37812f818d4e8cb63e65ebafd8e85c
5
5
  SHA512:
6
- metadata.gz: 56d9d3140ee5418e9b4e877e9756bbb1a1858314c4487b5d7e41ca5fc72f70532f764dcf480c8c3098f4297025fa66c7d8db0bd890e9ae46459e7478a34a685a
7
- data.tar.gz: 812f11c8a6c2c4ac5ec68852e75f64ae2d7416ae4683f5ff6525055dbf8e472baed3cc01a85eb76e5da2cb39233ff2dc2129cbdab7165dec89637987b346359b
6
+ metadata.gz: ca5026c1f26f1c465c0e2ed869c1a6f6f0dc3b229843d972f9c0267d2f25e98565a672a91b899796d5494391bac73b35d3f36782f0b4afdade1b4d525e09307a
7
+ data.tar.gz: 8ce3970ab67e95e68cfce154ed6865285f04f0e493c694a7014dee54901a9d64759299bf43c542ce23baf05e15676c9daebd5fa4c53703891cdf179a6a0cf769
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg
7
7
  /rdoc
8
8
  /.yardoc
9
+ /tmp
@@ -0,0 +1,10 @@
1
+ Blake Mizerany <blake.mizerany@gmail.com>
2
+ Lawrence Leonard Gilbert <larry@l2g.to>
3
+ <larry@l2g.to> <larry@L2G.to>
4
+ Marc-André Cournoyer <macournoyer@gmail.com>
5
+ Matthew Manning <matt.manning@gmail.com>
6
+ Nicholas Wieland <nicholas.wieland@gmail.com>
7
+ Rafael Ssouza <rafael.ssouza@gmail.com>
8
+ Richard Schneeman <richard.schneeman@gmail.com>
9
+ Rick Olson <technoweenie@gmail.com>
10
+ T. Watanabe <wtnabe@wt-srv.watanabe>
@@ -0,0 +1,2 @@
1
+ --display-cop-names
2
+ --fail-level=W
@@ -17,7 +17,7 @@ Lint/StringConversionInInterpolation:
17
17
  Lint/UnusedBlockArgument:
18
18
  Enabled: false
19
19
 
20
- Lint/Eval:
20
+ Security/Eval:
21
21
  Exclude:
22
22
  - rest-client.windows.gemspec
23
23
 
@@ -53,8 +53,9 @@ Style/BracesAroundHashParameters:
53
53
  Enabled: false
54
54
 
55
55
  # Offense count: 1
56
- Style/ClassAndModuleCamelCase:
57
- Enabled: false
56
+ Naming/ClassAndModuleCamelCase:
57
+ Exclude:
58
+ - lib/restclient/windows/root_certs.rb
58
59
 
59
60
  # Offense count: 2
60
61
  # Configuration parameters: EnforcedStyle, SupportedStyles.
@@ -102,7 +103,7 @@ Style/ConditionalAssignment:
102
103
  EnforcedStyle: assign_inside_condition
103
104
 
104
105
  # Offense count: 2
105
- Style/ConstantName:
106
+ Naming/ConstantName:
106
107
  Enabled: false
107
108
 
108
109
  # TODO: eh?
@@ -110,10 +111,8 @@ Style/ConstantName:
110
111
  Metrics/CyclomaticComplexity:
111
112
  Max: 22
112
113
 
113
- # Offense count: 1
114
- # Cop supports --auto-correct.
115
- Style/DeprecatedHashMethods:
116
- Enabled: false
114
+ Style/PreferredHashMethods:
115
+ EnforcedStyle: verbose
117
116
 
118
117
  # TODO: docs
119
118
  # Offense count: 17
@@ -122,7 +121,7 @@ Style/Documentation:
122
121
 
123
122
  # Offense count: 9
124
123
  # Configuration parameters: EnforcedStyle, SupportedStyles.
125
- Style/DotPosition:
124
+ Layout/DotPosition:
126
125
  Enabled: false
127
126
 
128
127
  # Offense count: 1
@@ -136,24 +135,27 @@ Style/EachWithObject:
136
135
 
137
136
  # Offense count: 5
138
137
  # Cop supports --auto-correct.
139
- Style/EmptyLines:
138
+ Layout/EmptyLines:
140
139
  Enabled: false
141
140
 
142
141
  # Offense count: 11
143
142
  # Cop supports --auto-correct.
144
143
  # Configuration parameters: EnforcedStyle, SupportedStyles.
145
- Style/EmptyLinesAroundClassBody:
144
+ Layout/EmptyLinesAroundClassBody:
146
145
  Enabled: false
147
146
 
148
147
  # Offense count: 1
149
148
  # Cop supports --auto-correct.
150
- Style/EmptyLinesAroundMethodBody:
149
+ Layout/EmptyLinesAroundMethodBody:
151
150
  Enabled: false
152
151
 
153
152
  # Offense count: 9
154
153
  # Cop supports --auto-correct.
155
154
  # Configuration parameters: EnforcedStyle, SupportedStyles.
156
- Style/EmptyLinesAroundModuleBody:
155
+ Layout/EmptyLinesAroundModuleBody:
156
+ Enabled: false
157
+
158
+ Layout/EmptyLinesAroundExceptionHandlingKeywords:
157
159
  Enabled: false
158
160
 
159
161
  # Offense count: 31
@@ -161,11 +163,9 @@ Style/EmptyLinesAroundModuleBody:
161
163
  Style/Encoding:
162
164
  Enabled: false
163
165
 
164
- # TODO: exclude
165
- # Offense count: 1
166
- # Configuration parameters: Exclude.
167
- Style/FileName:
168
- Enabled: false
166
+ Naming/FileName:
167
+ Exclude:
168
+ - lib/rest-client.rb
169
169
 
170
170
  # Offense count: 3
171
171
  # Configuration parameters: EnforcedStyle, SupportedStyles.
@@ -184,12 +184,9 @@ Style/HashSyntax:
184
184
  Style/IfUnlessModifier:
185
185
  Enabled: false
186
186
 
187
- # TODO: configure
188
- # Offense count: 6
189
- # Cop supports --auto-correct.
190
- # Configuration parameters: EnforcedStyle, SupportedStyles.
191
- Style/IndentHash:
192
- Enabled: false
187
+ Layout/IndentFirstHashElement:
188
+ Exclude:
189
+ - 'spec/**/*.rb'
193
190
 
194
191
  # NOTABUG
195
192
  # Offense count: 19
@@ -199,14 +196,13 @@ Style/Lambda:
199
196
  # TODO
200
197
  # Offense count: 14
201
198
  # Cop supports --auto-correct.
202
- Style/LeadingCommentSpace:
199
+ Layout/LeadingCommentSpace:
203
200
  Enabled: false
204
201
 
205
- # TODO
206
- # Offense count: 218
207
- # Configuration parameters: AllowURI.
208
202
  Metrics/LineLength:
209
- Max: 340
203
+ Exclude:
204
+ - 'spec/**/*.rb'
205
+ - 'Rakefile'
210
206
 
211
207
  # TODO
212
208
  # Offense count: 28
@@ -262,7 +258,7 @@ Style/PercentLiteralDelimiters:
262
258
 
263
259
  # Offense count: 3
264
260
  # Configuration parameters: NamePrefixBlacklist.
265
- Style/PredicateName:
261
+ Naming/PredicateName:
266
262
  Enabled: false
267
263
 
268
264
  # TODO: configure
@@ -298,47 +294,45 @@ Style/SignalException:
298
294
  # TODO
299
295
  # Offense count: 2
300
296
  # Cop supports --auto-correct.
301
- Style/SpaceAfterNot:
297
+ Layout/SpaceAfterNot:
302
298
  Enabled: false
303
299
 
304
300
  # Offense count: 19
305
301
  # Cop supports --auto-correct.
306
302
  # Configuration parameters: EnforcedStyle, SupportedStyles.
307
- Style/SpaceAroundEqualsInParameterDefault:
303
+ Layout/SpaceAroundEqualsInParameterDefault:
308
304
  Enabled: false
309
305
 
310
306
  # Offense count: 20
311
307
  # Cop supports --auto-correct.
312
- Style/SpaceAroundOperators:
308
+ Layout/SpaceAroundOperators:
313
309
  Enabled: false
314
310
 
315
311
  # Offense count: 9
316
312
  # Cop supports --auto-correct.
317
313
  # Configuration parameters: EnforcedStyle, SupportedStyles.
318
- Style/SpaceBeforeBlockBraces:
314
+ Layout/SpaceBeforeBlockBraces:
319
315
  Enabled: false
320
316
 
321
- # Offense count: 37
322
- # Cop supports --auto-correct.
323
- # Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
324
- Style/SpaceInsideBlockBraces:
317
+ Layout/EmptyLinesAroundBlockBody:
325
318
  Enabled: false
326
319
 
327
- # Offense count: 6
320
+ # Offense count: 37
328
321
  # Cop supports --auto-correct.
329
- Style/SpaceInsideBrackets:
322
+ # Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
323
+ Layout/SpaceInsideBlockBraces:
330
324
  Enabled: false
331
325
 
332
326
  # Offense count: 181
333
327
  # Cop supports --auto-correct.
334
328
  # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
335
- Style/SpaceInsideHashLiteralBraces:
329
+ Layout/SpaceInsideHashLiteralBraces:
336
330
  Enabled: false
337
331
 
338
332
  # TODO
339
333
  # Offense count: 9
340
334
  # Cop supports --auto-correct.
341
- Style/SpaceInsideParens:
335
+ Layout/SpaceInsideParens:
342
336
  Enabled: false
343
337
 
344
338
  # Offense count: 414
@@ -347,8 +341,10 @@ Style/SpaceInsideParens:
347
341
  Style/StringLiterals:
348
342
  Enabled: false
349
343
 
350
- Style/TrailingCommaInLiteral:
351
- EnforcedStyleForMultiline: comma
344
+ Style/TrailingCommaInArrayLiteral:
345
+ EnforcedStyleForMultiline: consistent_comma
346
+ Style/TrailingCommaInHashLiteral:
347
+ EnforcedStyleForMultiline: consistent_comma
352
348
  Style/TrailingCommaInArguments:
353
349
  Enabled: false
354
350
 
@@ -382,3 +378,9 @@ Style/WordArray:
382
378
  # Configuration parameters: EnforcedStyle, SupportedStyles.
383
379
  Style/BarePercentLiterals:
384
380
  Enabled: false
381
+
382
+
383
+ Style/RescueStandardError:
384
+ Exclude:
385
+ - 'bin/restclient'
386
+ - 'lib/restclient/windows/root_certs.rb'
@@ -1,3 +1,8 @@
1
1
  ---
2
2
  inherit_from:
3
3
  - .rubocop-disables.yml
4
+
5
+ AllCops:
6
+ Exclude:
7
+ - 'tmp/*.rb'
8
+ - 'vendor/**/*'
@@ -1,48 +1,62 @@
1
1
  # Available ruby versions: http://rubies.travis-ci.org/
2
2
 
3
3
  language: ruby
4
+ sudo: false
4
5
 
5
6
  os:
6
7
  - linux
7
- - osx
8
+ # - osx
8
9
 
9
10
  rvm:
10
- - "2.0.0"
11
11
  - "2.1" # latest 2.1.x
12
- - "2.2.5"
13
- - "2.3.3"
14
- - "2.4.0"
12
+ - "2.2.10"
13
+ - "2.3.8"
14
+ - "2.4.6"
15
+ - "2.5.5"
16
+ - "2.6.3"
15
17
  - "ruby-head"
16
- - "jruby-9.0.5.0"
17
- - "jruby-9.1.5.0"
18
+ - "jruby-9.1.9.0"
18
19
  - "jruby-head"
19
20
 
20
21
  cache: bundler
21
22
 
22
23
  script:
23
- bundle exec rake test
24
+ - bundle exec rake test
25
+ - bundle exec rake rubocop
24
26
 
25
27
  branches:
26
28
  except:
27
29
  - "readme-edits"
28
30
 
29
31
  before_install:
30
- - gem update --system
32
+ # Install rubygems < 3.0 so that we can support ruby < 2.3
33
+ # https://github.com/rubygems/rubygems/issues/2534
34
+ - gem install rubygems-update -v '<3' && update_rubygems
31
35
  # bundler installation needed for jruby-head
32
36
  # https://github.com/travis-ci/travis-ci/issues/5861
33
- - gem install bundler
34
-
35
- # Travis OS X support is pretty janky. These are some hacks to include tests
36
- # only on versions that actually work.
37
- # (last tested: 2016-11)
37
+ # stick to bundler 1.x in order to support ruby < 2.3
38
+ - gem install bundler -v '~> 1.17'
39
+
40
+ # Travis macOS support is pretty janky. These are some hacks to include tests
41
+ # only on versions that actually work. We test on macOS because Apple monkey
42
+ # patches OpenSSL to have different behavior, and we want to ensure that SSL
43
+ # verification at least is broken in the expected ways on macOS.
44
+ # (last tested: 2019-08)
38
45
  matrix:
39
46
  # exclude: {}
40
- # include: {}
47
+ include:
48
+ # test only a few versions on mac
49
+ - os: osx
50
+ rvm: 2.6.3
51
+ - os: osx
52
+ rvm: ruby-head
53
+ - os: osx
54
+ rvm: jruby-9.1.9.0
55
+ - os: osx
56
+ rvm: jruby-head
41
57
 
42
58
  allow_failures:
43
59
  - rvm: 'ruby-head'
44
60
 
45
61
  # return results as soon as mandatory versions are done
46
62
  fast_finish: true
47
-
48
- sudo: false
data/AUTHORS CHANGED
@@ -7,6 +7,7 @@ Adrian Rangel
7
7
  Alex Tomlins
8
8
  Aman Gupta
9
9
  Andy Brody
10
+ Avi Deitcher
10
11
  Blake Mizerany
11
12
  Brad Ediger
12
13
  Braintree
@@ -38,10 +39,12 @@ Harm Aarts
38
39
  Hiro Asari
39
40
  Hugh McGowan
40
41
  Ian Warshak
42
+ Igor Zubkov
41
43
  Ivan Makfinsky
42
44
  JH. Chabran
43
45
  James Edward Gray II
44
46
  Jari Bakken
47
+ Jeff Pereira
45
48
  Jeff Remer
46
49
  Jeffrey Hardy
47
50
  Jeremy Kemper
@@ -59,12 +62,14 @@ Keith Rarick
59
62
  Kenichi Kamiya
60
63
  Kevin Read
61
64
  Kosuke Asami
65
+ Kyle Meyer
62
66
  Kyle VanderBeek
63
67
  Lars Gierth
64
68
  Lawrence Leonard Gilbert
65
69
  Lee Jarvis
66
70
  Lennon Day-Reynolds
67
71
  Lin Jen-Shin
72
+ Magne Matre Gåsland
68
73
  Marc-André Cournoyer
69
74
  Marius Butuc
70
75
  Matthew Manning
@@ -77,6 +82,7 @@ Nicholas Wieland
77
82
  Nick Hammond
78
83
  Nick Plante
79
84
  Niko Dittmann
85
+ Nikolay Shebanov
80
86
  Oscar Del Ben
81
87
  Pablo Astigarraga
82
88
  Paul Dlug
@@ -85,9 +91,11 @@ Pedro Chambino
85
91
  Philip Corliss
86
92
  Pierre-Louis Gottfrois
87
93
  Rafael Ssouza
94
+ Richard Schneeman
88
95
  Rick Olson
89
96
  Robert Eanes
90
97
  Rodrigo Panachi
98
+ Sam Norbury
91
99
  Samuel Cochran
92
100
  Syl Turner
93
101
  T. Watanabe
data/README.md CHANGED
@@ -39,6 +39,7 @@ The rest-client gem depends on these other gems for usage at runtime:
39
39
 
40
40
  * [mime-types](http://rubygems.org/gems/mime-types)
41
41
  * [netrc](http://rubygems.org/gems/netrc)
42
+ * [http-accept](https://rubygems.org/gems/http-accept)
42
43
  * [http-cookie](https://rubygems.org/gems/http-cookie)
43
44
 
44
45
  There are also several development dependencies. It's recommended to use
@@ -359,7 +360,7 @@ RestClient.get('http://example.com/resource') { |response, request, result, &blo
359
360
  when 423
360
361
  raise SomeCustomExceptionIfYouWant
361
362
  else
362
- response.return!(request, result, &block)
363
+ response.return!(&block)
363
364
  end
364
365
  }
365
366
  ```
@@ -446,6 +447,106 @@ You can:
446
447
 
447
448
  See `RestClient::Request`'s documentation for more information.
448
449
 
450
+ ### Streaming request payload
451
+
452
+ RestClient will try to stream any file-like payload rather than reading it into
453
+ memory. This happens through `RestClient::Payload::Streamed`, which is
454
+ automatically called internally by `RestClient::Payload.generate` on anything
455
+ with a `read` method.
456
+
457
+ ```ruby
458
+ >> r = RestClient.put('http://httpbin.org/put', File.open('/tmp/foo.txt', 'r'),
459
+ content_type: 'text/plain')
460
+ => <RestClient::Response 200 "{\n \"args\":...">
461
+ ```
462
+
463
+ In Multipart requests, RestClient will also stream file handles passed as Hash
464
+ (or __new in 2.1__ ParamsArray).
465
+
466
+ ```ruby
467
+ >> r = RestClient.put('http://httpbin.org/put',
468
+ {file_a: File.open('a.txt', 'r'),
469
+ file_b: File.open('b.txt', 'r')})
470
+ => <RestClient::Response 200 "{\n \"args\":...">
471
+
472
+ # received by server as two file uploads with multipart/form-data
473
+ >> JSON.parse(r)['files'].keys
474
+ => ['file_a', 'file_b']
475
+ ```
476
+
477
+ ### Streaming responses
478
+
479
+ Normally, when you use `RestClient.get` or the lower level
480
+ `RestClient::Request.execute method: :get` to retrieve data, the entire
481
+ response is buffered in memory and returned as the response to the call.
482
+
483
+ However, if you are retrieving a large amount of data, for example a Docker
484
+ image, an iso, or any other large file, you may want to stream the response
485
+ directly to disk rather than loading it in memory. If you have a very large
486
+ file, it may become *impossible* to load it into memory.
487
+
488
+ There are two main ways to do this:
489
+
490
+ #### `raw_response`, saves into Tempfile
491
+
492
+ If you pass `raw_response: true` to `RestClient::Request.execute`, it will save
493
+ the response body to a temporary file (using `Tempfile`) and return a
494
+ `RestClient::RawResponse` object rather than a `RestClient::Response`.
495
+
496
+ Note that the tempfile created by `Tempfile.new` will be in `Dir.tmpdir`
497
+ (usually `/tmp/`), which you can override to store temporary files in a
498
+ different location. This file will be unlinked when it is dereferenced.
499
+
500
+ If logging is enabled, this will also print download progress.
501
+ __New in 2.1:__ Customize the interval with `:stream_log_percent` (defaults to
502
+ 10 for printing a message every 10% complete).
503
+
504
+ For example:
505
+
506
+ ```ruby
507
+ >> raw = RestClient::Request.execute(
508
+ method: :get,
509
+ url: 'http://releases.ubuntu.com/16.04.2/ubuntu-16.04.2-desktop-amd64.iso',
510
+ raw_response: true)
511
+ => <RestClient::RawResponse @code=200, @file=#<Tempfile:/tmp/rest-client.20170522-5346-1pptjm1>, @request=<RestClient::Request @method="get", @url="http://releases.ubuntu.com/16.04.2/ubuntu-16.04.2-desktop-amd64.iso">>
512
+ >> raw.file.size
513
+ => 1554186240
514
+ >> raw.file.path
515
+ => "/tmp/rest-client.20170522-5346-1pptjm1"
516
+ raw.file.path
517
+ => "/tmp/rest-client.20170522-5346-1pptjm1"
518
+
519
+ >> require 'digest/sha1'
520
+ >> Digest::SHA1.file(raw.file.path).hexdigest
521
+ => "4375b73e3a1aa305a36320ffd7484682922262b3"
522
+ ```
523
+
524
+ #### `block_response`, receives raw Net::HTTPResponse
525
+
526
+ If you want to stream the data from the response to a file as it comes, rather
527
+ than entirely in memory, you can also pass `RestClient::Request.execute` a
528
+ parameter `:block_response` to which you pass a block/proc. This block receives
529
+ the raw unmodified Net::HTTPResponse object from Net::HTTP, which you can use
530
+ to stream directly to a file as each chunk is received.
531
+
532
+ Note that this bypasses all the usual HTTP status code handling, so you will
533
+ want to do you own checking for HTTP 20x response codes, redirects, etc.
534
+
535
+ The following is an example:
536
+
537
+ ````ruby
538
+ File.open('/some/output/file', 'w') {|f|
539
+ block = proc { |response|
540
+ response.read_body do |chunk|
541
+ f.write chunk
542
+ end
543
+ }
544
+ RestClient::Request.execute(method: :get,
545
+ url: 'http://example.com/some/really/big/file.img',
546
+ block_response: block)
547
+ }
548
+ ````
549
+
449
550
  ## Shell
450
551
 
451
552
  The restclient shell command gives an IRB session with RestClient already loaded:
@@ -498,15 +599,32 @@ $ restclient put http://example.com/resource < input_body
498
599
 
499
600
  ## Logging
500
601
 
501
- To enable logging you can:
602
+ To enable logging globally you can:
502
603
 
503
- - set RestClient.log with a Ruby Logger, or
504
- - set an environment variable to avoid modifying the code (in this case you can use a file name, "stdout" or "stderr"):
604
+ - set RestClient.log with a Ruby Logger
605
+
606
+ ```ruby
607
+ RestClient.log = STDOUT
608
+ ```
609
+
610
+ - or set an environment variable to avoid modifying the code (in this case you can use a file name, "stdout" or "stderr"):
505
611
 
506
612
  ```ruby
507
613
  $ RESTCLIENT_LOG=stdout path/to/my/program
508
614
  ```
509
- Either produces logs like this:
615
+
616
+ You can also set individual loggers when instantiating a Resource or making an
617
+ individual request:
618
+
619
+ ```ruby
620
+ resource = RestClient::Resource.new 'http://example.com/resource', log: Logger.new(STDOUT)
621
+ ```
622
+
623
+ ```ruby
624
+ RestClient::Request.execute(method: :get, url: 'http://example.com/foo', log: Logger.new(STDERR))
625
+ ```
626
+
627
+ All options produce logs like this:
510
628
 
511
629
  ```ruby
512
630
  RestClient.get "http://some/resource"
@@ -774,11 +892,10 @@ See AUTHORS for the full list.
774
892
 
775
893
  ## Legal
776
894
 
777
- Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
895
+ Released under the MIT License: https://opensource.org/licenses/MIT
778
896
 
779
- "Master Shake" photo (http://www.flickr.com/photos/solgrundy/924205581/) by
780
- "SolGrundy"; used under terms of the Creative Commons Attribution-ShareAlike 2.0
781
- Generic license (http://creativecommons.org/licenses/by-sa/2.0/)
897
+ Photo of the International Space Station was produced by NASA and is in the
898
+ public domain.
782
899
 
783
900
  Code for reading Windows root certificate store derived from work by Puppet;
784
901
  used under terms of the Apache License, Version 2.0.