http 4.4.1 → 5.1.1

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +85 -0
  3. data/.gitignore +6 -10
  4. data/.rspec +0 -4
  5. data/.rubocop/layout.yml +8 -0
  6. data/.rubocop/style.yml +32 -0
  7. data/.rubocop.yml +8 -110
  8. data/.rubocop_todo.yml +206 -0
  9. data/.yardopts +1 -1
  10. data/CHANGES.md +200 -3
  11. data/Gemfile +18 -10
  12. data/LICENSE.txt +1 -1
  13. data/README.md +48 -86
  14. data/Rakefile +2 -10
  15. data/SECURITY.md +5 -0
  16. data/http.gemspec +9 -8
  17. data/lib/http/chainable.rb +23 -17
  18. data/lib/http/client.rb +44 -34
  19. data/lib/http/connection.rb +11 -7
  20. data/lib/http/content_type.rb +12 -7
  21. data/lib/http/errors.rb +3 -0
  22. data/lib/http/feature.rb +3 -1
  23. data/lib/http/features/auto_deflate.rb +6 -6
  24. data/lib/http/features/auto_inflate.rb +6 -7
  25. data/lib/http/features/instrumentation.rb +1 -1
  26. data/lib/http/features/logging.rb +19 -21
  27. data/lib/http/headers.rb +50 -13
  28. data/lib/http/mime_type/adapter.rb +3 -1
  29. data/lib/http/mime_type/json.rb +1 -0
  30. data/lib/http/options.rb +5 -8
  31. data/lib/http/redirector.rb +55 -4
  32. data/lib/http/request/body.rb +1 -0
  33. data/lib/http/request/writer.rb +9 -4
  34. data/lib/http/request.rb +28 -11
  35. data/lib/http/response/body.rb +6 -4
  36. data/lib/http/response/inflater.rb +1 -1
  37. data/lib/http/response/parser.rb +74 -62
  38. data/lib/http/response/status.rb +4 -3
  39. data/lib/http/response.rb +44 -18
  40. data/lib/http/timeout/global.rb +20 -36
  41. data/lib/http/timeout/null.rb +2 -1
  42. data/lib/http/timeout/per_operation.rb +32 -55
  43. data/lib/http/uri.rb +51 -6
  44. data/lib/http/version.rb +1 -1
  45. data/spec/lib/http/client_spec.rb +155 -30
  46. data/spec/lib/http/connection_spec.rb +8 -5
  47. data/spec/lib/http/features/auto_inflate_spec.rb +3 -2
  48. data/spec/lib/http/features/instrumentation_spec.rb +27 -21
  49. data/spec/lib/http/features/logging_spec.rb +8 -10
  50. data/spec/lib/http/headers_spec.rb +53 -18
  51. data/spec/lib/http/options/headers_spec.rb +1 -1
  52. data/spec/lib/http/options/merge_spec.rb +16 -16
  53. data/spec/lib/http/redirector_spec.rb +133 -3
  54. data/spec/lib/http/request/body_spec.rb +3 -3
  55. data/spec/lib/http/request/writer_spec.rb +25 -2
  56. data/spec/lib/http/request_spec.rb +5 -5
  57. data/spec/lib/http/response/body_spec.rb +5 -5
  58. data/spec/lib/http/response/parser_spec.rb +33 -4
  59. data/spec/lib/http/response/status_spec.rb +3 -3
  60. data/spec/lib/http/response_spec.rb +80 -3
  61. data/spec/lib/http/uri_spec.rb +39 -0
  62. data/spec/lib/http_spec.rb +30 -3
  63. data/spec/spec_helper.rb +21 -21
  64. data/spec/support/black_hole.rb +1 -1
  65. data/spec/support/dummy_server/servlet.rb +19 -6
  66. data/spec/support/dummy_server.rb +7 -7
  67. data/spec/support/fuubar.rb +21 -0
  68. data/spec/support/http_handling_shared.rb +5 -5
  69. data/spec/support/simplecov.rb +19 -0
  70. data/spec/support/ssl_helper.rb +4 -4
  71. metadata +22 -14
  72. data/.coveralls.yml +0 -1
  73. data/.travis.yml +0 -39
data/CHANGES.md CHANGED
@@ -1,9 +1,183 @@
1
- ## 4.4.1 (2020-03-29)
1
+ ## 5.1.1 (2022-12-17)
2
2
 
3
- * Backport [#590](https://github.com/httprb/http/pull/590)
4
- Fix parser failing on some edge cases.
3
+ * [#731](https://github.com/httprb/http/pull/731)
4
+ Strip brackets from IPv6 addresses in `HTTP::URI`.
5
+ ([@jeraki])
6
+
7
+ * [#722](https://github.com/httprb/http/pull/722)
8
+ Add `on_redirect` callback.
9
+ ([@benubois])
10
+
11
+ ## 5.1.0 (2022-06-17)
12
+
13
+ * Drop ruby-2.5 support.
14
+
15
+ * [#715](https://github.com/httprb/http/pull/715)
16
+ Set default encoding to UTF-8 for `application/json`.
17
+ ([@drwl])
18
+
19
+ * [#712](https://github.com/httprb/http/pull/712)
20
+ Recognize cookies set by redirect.
21
+ ([@tkellogg])
22
+
23
+ * [#707](https://github.com/httprb/http/pull/707)
24
+ Distinguish connection timeouts.
25
+ ([@YuLeven])
26
+
27
+ ## 5.0.4 (2021-10-07)
28
+
29
+ * [#698](https://github.com/httprb/http/pull/698)
30
+ Fix `HTTP::Timeout::Global#connect_ssl`.
31
+ ([@tarcieri])
32
+
33
+ ## 5.0.3 (2021-10-06)
34
+
35
+ * [#695](https://github.com/httprb/http/pull/695)
36
+ Revert DNS resolving feature.
37
+ ([@PhilCoggins])
38
+
39
+ * [#694](https://github.com/httprb/http/pull/694)
40
+ Fix cookies extraction.
41
+ ([@flosacca])
42
+
43
+ ## 5.0.2 (2021-09-10)
44
+
45
+ * [#686](https://github.com/httprb/http/pull/686)
46
+ Correctly reset the parser.
47
+ ([@bryanp])
48
+
49
+ * [#684](https://github.com/httprb/http/pull/684)
50
+ Don't set Content-Length for GET, HEAD, DELETE, or CONNECT requests without a BODY.
51
+ ([@jyn514])
52
+
53
+ * [#679](https://github.com/httprb/http/pull/679)
54
+ Use features on redirected requests.
55
+ ([@nomis])
56
+
57
+ * [#678](https://github.com/schwern)
58
+ Restore `HTTP::Response` `:uri` option for backwards compatibility.
59
+ ([@schwern])
60
+
61
+ * [#676](https://github.com/httprb/http/pull/676)
62
+ Update addressable because of CVE-2021-32740.
63
+ ([@matheussilvasantos])
64
+
65
+ * [#653](https://github.com/httprb/http/pull/653)
66
+ Avoid force encodings on frozen strings.
67
+ ([@bvicenzo])
68
+
69
+ * [#638](https://github.com/httprb/http/pull/638)
70
+ DNS failover handling.
71
+ ([@midnight-wonderer])
72
+
73
+
74
+ ## 5.0.1 (2021-06-26)
75
+
76
+ * [#670](https://github.com/httprb/http/pull/670)
77
+ Revert `Response#parse` behavior introduced in [#540].
78
+ ([@DannyBen])
79
+
80
+ * [#669](https://github.com/httprb/http/pull/669)
81
+ Prevent bodies from being resubmitted when following unsafe redirects.
82
+ ([@odinhb])
83
+
84
+ * [#664](https://github.com/httprb/http/pull/664)
85
+ Bump llhttp-ffi to 0.3.0.
86
+ ([@bryanp])
87
+
88
+
89
+ ## 5.0.0 (2021-05-12)
90
+
91
+ * [#656](https://github.com/httprb/http/pull/656)
92
+ Handle connection timeouts in `Features`
93
+ ([@semenyukdmitry])
94
+
95
+ * [#651](https://github.com/httprb/http/pull/651)
96
+ Replace `http-parser` with `llhttp`
97
+ ([@bryanp])
98
+
99
+ * [#647](https://github.com/httprb/http/pull/647)
100
+ Add support for `MKCALENDAR` HTTP verb
101
+ ([@meanphil])
102
+
103
+ * [#632](https://github.com/httprb/http/pull/632)
104
+ Respect the SSL context's `verify_hostname` value
105
+ ([@colemannugent])
106
+
107
+ * [#625](https://github.com/httprb/http/pull/625)
108
+ Fix inflator with empty responses
109
+ ([@LukaszMaslej])
110
+
111
+ * [#599](https://github.com/httprb/http/pull/599)
112
+ Allow passing `HTTP::FormData::{Multipart,UrlEncoded}` object directly.
113
+ ([@ixti])
114
+
115
+ * [#593](https://github.com/httprb/http/pull/593)
116
+ [#592](https://github.com/httprb/http/issues/592)
117
+ Support informational (1XX) responses.
118
+ ([@ixti])
119
+
120
+ * [#590](https://github.com/httprb/http/pull/590)
121
+ [#589](https://github.com/httprb/http/issues/589)
122
+ Fix response headers paring.
123
+ ([@Bonias])
124
+
125
+ * [#587](https://github.com/httprb/http/pull/587)
126
+ [#585](https://github.com/httprb/http/issues/585)
127
+ Fix redirections when server responds with multiple Location headers.
128
+ ([@ixti])
129
+
130
+ * [#581](https://github.com/httprb/http/pull/581)
131
+ [#582](https://github.com/httprb/http/issues/582)
132
+ Add Ruby 2.7.x support.
133
+ ([@janko])
134
+
135
+ * [#577](https://github.com/httprb/http/pull/577)
136
+ Fix `Chainable#timeout` with frozen Hash.
137
+ ([@antonvolkoff])
138
+
139
+ * [#576](https://github.com/httprb/http/pull/576)
140
+ [#524](https://github.com/httprb/http/issues/524)
141
+ **BREAKING CHANGE**
142
+ Preserve header names casing.
143
+ ([@joshuaflanagan])
144
+
145
+ * [#540](https://github.com/httprb/http/pull/540)
146
+ [#538](https://github.com/httprb/http/issues/538)
147
+ **BREAKING CHANGE**
148
+ Require explicit MIME type for Response#parse
149
+ ([@ixti])
150
+
151
+ * [#532](https://github.com/httprb/http/pull/532)
152
+ Fix pipes support in request bodies.
5
153
  ([@ixti])
6
154
 
155
+ * [#530](https://github.com/httprb/http/pull/530)
156
+ Improve header fields name/value validation.
157
+ ([@Bonias])
158
+
159
+ * [#506](https://github.com/httprb/http/pull/506)
160
+ [#521](https://github.com/httprb/http/issues/521)
161
+ Skip auto-deflate when there is no body.
162
+ ([@Bonias])
163
+
164
+ * [#489](https://github.com/httprb/http/pull/489)
165
+ Fix HTTP parser.
166
+ ([@ixti], [@fxposter])
167
+
168
+ * [#546](https://github.com/httprb/http/pull/546)
169
+ **BREAKING CHANGE**
170
+ Provide initiating `HTTP::Request` object on `HTTP::Response`.
171
+ ([@joshuaflanagan])
172
+
173
+ * [#571](https://github.com/httprb/http/pull/571)
174
+ Drop Ruby 2.3.x support.
175
+ ([@ixti])
176
+
177
+ * [3ed0c31](https://github.com/httprb/http/commit/3ed0c318eab6a8c390654cda17bf6df9e963c7d6)
178
+ Drop Ruby 2.4.x support.
179
+
180
+
7
181
  ## 4.4.0 (2020-03-25)
8
182
 
9
183
  * Backport [#587](https://github.com/httprb/http/pull/587)
@@ -14,6 +188,7 @@
14
188
  Allow passing HTTP::FormData::{Multipart,UrlEncoded} object directly.
15
189
  ([@ixti])
16
190
 
191
+
17
192
  ## 4.3.0 (2020-01-09)
18
193
 
19
194
  * Backport [#581](https://github.com/httprb/http/pull/581)
@@ -803,3 +978,25 @@ end
803
978
  [@RickCSong]: https://github.com/RickCSong
804
979
  [@fxposter]: https://github.com/fxposter
805
980
  [@mamoonraja]: https://github.com/mamoonraja
981
+ [@joshuaflanagan]: https://github.com/joshuaflanagan
982
+ [@antonvolkoff]: https://github.com/antonvolkoff
983
+ [@LukaszMaslej]: https://github.com/LukaszMaslej
984
+ [@colemannugent]: https://github.com/colemannugent
985
+ [@semenyukdmitry]: https://github.com/semenyukdmitry
986
+ [@bryanp]: https://github.com/bryanp
987
+ [@meanphil]: https://github.com/meanphil
988
+ [@odinhb]: https://github.com/odinhb
989
+ [@DannyBen]: https://github.com/DannyBen
990
+ [@jyn514]: https://github.com/jyn514
991
+ [@bvicenzo]: https://github.com/bvicenzo
992
+ [@nomis]: https://github.com/nomis
993
+ [@midnight-wonderer]: https://github.com/midnight-wonderer
994
+ [@schwern]: https://github.com/schwern
995
+ [@matheussilvasantos]: https://github.com/matheussilvasantos
996
+ [@PhilCoggins]: https://github.com/PhilCoggins
997
+ [@flosacca]: https://github.com/flosacca
998
+ [@YuLeven]: https://github.com/YuLeven
999
+ [@drwl]: https://github.com/drwl
1000
+ [@tkellogg]: https://github.com/tkellogg
1001
+ [@jeraki]: https://github.com/jeraki
1002
+ [@benubois]: https://github.com/benubois
data/Gemfile CHANGED
@@ -5,30 +5,38 @@ ruby RUBY_VERSION
5
5
 
6
6
  gem "rake"
7
7
 
8
+ # Ruby 3.0 does not ship it anymore.
9
+ # TODO: We should probably refactor specs to avoid need for it.
10
+ gem "webrick"
11
+
8
12
  group :development do
9
13
  gem "guard-rspec", :require => false
10
14
  gem "nokogiri", :require => false
11
15
  gem "pry", :require => false
12
16
 
13
- platform :ruby_20 do
14
- gem "pry-debugger", :require => false
15
- gem "pry-stack_explorer", :require => false
17
+ # RSpec formatter
18
+ gem "fuubar", :require => false
19
+
20
+ platform :mri do
21
+ gem "pry-byebug"
16
22
  end
17
23
  end
18
24
 
19
25
  group :test do
20
- gem "activemodel", :require => false # Used by certificate_authority
21
- gem "certificate_authority", :require => false
26
+ gem "certificate_authority", "~> 1.0", :require => false
22
27
 
23
28
  gem "backports"
24
29
 
25
- gem "coveralls", :require => false
26
- gem "simplecov", ">= 0.9"
30
+ gem "rubocop", "~> 1.30.0"
31
+ gem "rubocop-performance"
32
+ gem "rubocop-rake"
33
+ gem "rubocop-rspec"
27
34
 
28
- gem "rspec", "~> 3.0"
29
- gem "rspec-its"
35
+ gem "simplecov", :require => false
36
+ gem "simplecov-lcov", :require => false
30
37
 
31
- gem "rubocop", "= 0.49.1"
38
+ gem "rspec", "~> 3.10"
39
+ gem "rspec-its"
32
40
 
33
41
  gem "yardstick"
34
42
  end
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011-2016 Tony Arcieri, Erik Michaels-Ober, Alexey V. Zapparov, Zachary Anker
1
+ Copyright (c) 2011-2022 Tony Arcieri, Erik Michaels-Ober, Alexey V. Zapparov, Zachary Anker
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,85 +1,32 @@
1
- # ![http.rb](https://raw.github.com/httprb/http.rb/master/logo.png)
1
+ # ![http.rb](https://raw.github.com/httprb/http.rb/main/logo.png)
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/http.svg)](https://rubygems.org/gems/http)
4
- [![Build Status](https://secure.travis-ci.org/httprb/http.svg?branch=4-x-stable)](https://travis-ci.org/httprb/http)
5
- [![Code Climate](https://codeclimate.com/github/httprb/http.svg?branch=4-x-stable)](https://codeclimate.com/github/httprb/http)
6
- [![Coverage Status](https://coveralls.io/repos/httprb/http/badge.svg?branch=4-x-stable)](https://coveralls.io/r/httprb/http)
7
- [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/httprb/http/blob/4-x-stable/LICENSE.txt)
3
+ [![Gem Version][gem-image]][gem-link]
4
+ [![MIT licensed][license-image]][license-link]
5
+ [![Build Status][build-image]][build-link]
6
+ [![Code Climate][codeclimate-image]][codeclimate-link]
8
7
 
9
8
  [Documentation]
10
9
 
11
- _NOTE: This is the 4.x **stable** branch. For the 3.x **stable** branch, please see:_
12
-
13
- https://github.com/httprb/http/tree/3-x-stable
14
-
15
10
  ## About
16
11
 
17
12
  HTTP (The Gem! a.k.a. http.rb) is an easy-to-use client library for making requests
18
13
  from Ruby. It uses a simple method chaining system for building requests, similar to
19
14
  Python's [Requests].
20
15
 
21
- Under the hood, http.rb uses [http_parser.rb], a fast HTTP parsing native
22
- extension based on the Node.js parser and a Java port thereof. This library
23
- isn't just yet another wrapper around Net::HTTP. It implements the HTTP protocol
24
- natively and outsources the parsing to native extensions.
25
-
26
- [requests]: http://docs.python-requests.org/en/latest/
27
- [http_parser.rb]: https://github.com/tmm1/http_parser.rb
28
-
29
-
30
- ## Another Ruby HTTP library? Why should I care?
31
-
32
- There are a lot of HTTP libraries to choose from in the Ruby ecosystem.
33
- So why would you choose this one?
16
+ Under the hood, http.rb uses the [llhttp] parser, a fast HTTP parsing native extension.
17
+ This library isn't just yet another wrapper around `Net::HTTP`. It implements the HTTP
18
+ protocol natively and outsources the parsing to native extensions.
34
19
 
35
- Top three reasons:
20
+ ### Why http.rb?
36
21
 
37
- 1. **Clean API**: http.rb offers an easy-to-use API that should be a
22
+ - **Clean API**: http.rb offers an easy-to-use API that should be a
38
23
  breath of fresh air after using something like Net::HTTP.
39
24
 
40
- 2. **Maturity**: http.rb is one of the most mature Ruby HTTP clients, supporting
25
+ - **Maturity**: http.rb is one of the most mature Ruby HTTP clients, supporting
41
26
  features like persistent connections and fine-grained timeouts.
42
27
 
43
- 3. **Performance**: using native parsers and a clean, lightweight implementation,
44
- http.rb achieves the best performance of any Ruby HTTP library which
45
- implements the HTTP protocol in Ruby instead of C:
46
-
47
- | HTTP client | Time | Implementation |
48
- |--------------------------|--------|-----------------------|
49
- | curb (persistent) | 2.519 | libcurl wrapper |
50
- | em-http-request | 2.731 | EM + http_parser.rb |
51
- | Typhoeus | 2.851 | libcurl wrapper |
52
- | StreamlyFFI (persistent) | 2.853 | libcurl wrapper |
53
- | http.rb (persistent) | 2.970 | Ruby + http_parser.rb |
54
- | http.rb | 3.588 | Ruby + http_parser.rb |
55
- | HTTParty | 3.931 | Net::HTTP wrapper |
56
- | Net::HTTP | 3.959 | Pure Ruby |
57
- | Net::HTTP (persistent) | 4.043 | Pure Ruby |
58
- | open-uri | 4.479 | Net::HTTP wrapper |
59
- | Excon (persistent) | 4.618 | Pure Ruby |
60
- | Excon | 4.701 | Pure Ruby |
61
- | RestClient | 26.838 | Net::HTTP wrapper |
62
-
63
- Benchmarks performed using excon's benchmarking tool
64
-
65
- DISCLAIMER: Most benchmarks you find in READMEs are crap,
66
- including this one. These are out-of-date. If you care about
67
- performance, benchmark for yourself for your own use cases!
68
-
69
- ## Help and Discussion
70
-
71
- If you need help or just want to talk about the http.rb,
72
- visit the http.rb Google Group:
73
-
74
- https://groups.google.com/forum/#!forum/httprb
75
-
76
- You can join by email by sending a message to:
77
-
78
- [httprb+subscribe@googlegroups.com](mailto:httprb+subscribe@googlegroups.com)
79
-
80
- If you believe you've found a bug, please report it at:
81
-
82
- https://github.com/httprb/http/issues
28
+ - **Performance**: using native parsers and a clean, lightweight implementation,
29
+ http.rb achieves high performance while implementing HTTP in Ruby instead of C.
83
30
 
84
31
 
85
32
  ## Installation
@@ -114,10 +61,9 @@ for more detailed documentation and usage notes.
114
61
 
115
62
  The following API documentation is also available:
116
63
 
117
- * [YARD API documentation](http://www.rubydoc.info/gems/http/frames)
118
- * [Chainable module (all chainable methods)](http://www.rubydoc.info/gems/http/HTTP/Chainable)
64
+ - [YARD API documentation](https://www.rubydoc.info/github/httprb/http)
65
+ - [Chainable module (all chainable methods)](https://www.rubydoc.info/github/httprb/http/HTTP/Chainable)
119
66
 
120
- [documentation]: https://github.com/httprb/http/wiki
121
67
 
122
68
  ### Basic Usage
123
69
 
@@ -144,7 +90,7 @@ We can also obtain an `HTTP::Response::Body` object for this response:
144
90
  ```
145
91
 
146
92
  The response body can be streamed with `HTTP::Response::Body#readpartial`.
147
- In practice, you'll want to bind the HTTP::Response::Body to a local variable
93
+ In practice, you'll want to bind the `HTTP::Response::Body` to a local variable
148
94
  and call `#readpartial` on it repeatedly until it returns `nil`:
149
95
 
150
96
  ```ruby
@@ -161,14 +107,14 @@ and call `#readpartial` on it repeatedly until it returns `nil`:
161
107
 
162
108
  ## Supported Ruby Versions
163
109
 
164
- This library aims to support and is [tested against][travis] the following Ruby
165
- versions:
110
+ This library aims to support and is [tested against][build-link]
111
+ the following Ruby versions:
166
112
 
167
- * Ruby 2.3.x
168
- * Ruby 2.4.x
169
- * Ruby 2.5.x
170
- * Ruby 2.6.x
171
- * JRuby 9.2.x.x
113
+ - Ruby 2.6
114
+ - Ruby 2.7
115
+ - Ruby 3.0
116
+ - Ruby 3.1
117
+ - JRuby 9.3
172
118
 
173
119
  If something doesn't work on one of these versions, it's a bug.
174
120
 
@@ -183,20 +129,36 @@ patches in a timely fashion. If critical issues for a particular implementation
183
129
  exist at the time of a major release, support for that Ruby version may be
184
130
  dropped.
185
131
 
186
- [travis]: http://travis-ci.org/httprb/http
187
-
188
132
 
189
133
  ## Contributing to http.rb
190
134
 
191
- * Fork http.rb on GitHub
192
- * Make your changes
193
- * Ensure all tests pass (`bundle exec rake`)
194
- * Send a pull request
195
- * If we like them we'll merge them
196
- * If we've accepted a patch, feel free to ask for commit access!
135
+ - Fork http.rb on GitHub
136
+ - Make your changes
137
+ - Ensure all tests pass (`bundle exec rake`)
138
+ - Send a pull request
139
+ - If we like them we'll merge them
140
+ - If we've accepted a patch, feel free to ask for commit access!
197
141
 
198
142
 
199
143
  ## Copyright
200
144
 
201
- Copyright (c) 2011-2019 Tony Arcieri, Alexey V. Zapparov, Erik Michaels-Ober, Zachary Anker.
145
+ Copyright © 2011-2022 Tony Arcieri, Alexey V. Zapparov, Erik Michaels-Ober, Zachary Anker.
202
146
  See LICENSE.txt for further details.
147
+
148
+
149
+ [//]: # (badges)
150
+
151
+ [gem-image]: https://img.shields.io/gem/v/http?logo=ruby
152
+ [gem-link]: https://rubygems.org/gems/http
153
+ [license-image]: https://img.shields.io/badge/license-MIT-blue.svg
154
+ [license-link]: https://github.com/httprb/http/blob/main/LICENSE.txt
155
+ [build-image]: https://github.com/httprb/http/workflows/CI/badge.svg
156
+ [build-link]: https://github.com/httprb/http/actions/workflows/ci.yml
157
+ [codeclimate-image]: https://codeclimate.com/github/httprb/http.svg?branch=main
158
+ [codeclimate-link]: https://codeclimate.com/github/httprb/http
159
+
160
+ [//]: # (links)
161
+
162
+ [documentation]: https://github.com/httprb/http/wiki
163
+ [requests]: http://docs.python-requests.org/en/latest/
164
+ [llhttp]: https://llhttp.org/
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ task :generate_status_codes do
35
35
  end
36
36
 
37
37
  File.open("./lib/http/response/status/reasons.rb", "w") do |io|
38
- io.puts <<-TPL.gsub(/^[ ]{6}/, "")
38
+ io.puts <<~TPL
39
39
  # AUTO-GENERATED FILE, DO NOT CHANGE IT MANUALLY
40
40
 
41
41
  require "delegate"
@@ -61,12 +61,4 @@ task :generate_status_codes do
61
61
  end
62
62
  end
63
63
 
64
- if ENV["CI"].nil?
65
- task :default => %i[spec rubocop verify_measurements]
66
- else
67
- case ENV["SUITE"]
68
- when "rubocop" then task :default => :rubocop
69
- when "yardstick" then task :default => :verify_measurements
70
- else task :default => :spec
71
- end
72
- end
64
+ task :default => %i[spec rubocop verify_measurements]
data/SECURITY.md ADDED
@@ -0,0 +1,5 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a Vulnerability
4
+
5
+ Please report security issues to `bascule@gmail.com`
data/http.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "http/version"
6
6
 
@@ -25,19 +25,20 @@ Gem::Specification.new do |gem|
25
25
  gem.require_paths = ["lib"]
26
26
  gem.version = HTTP::VERSION
27
27
 
28
- gem.required_ruby_version = ">= 2.3"
28
+ gem.required_ruby_version = ">= 2.6"
29
29
 
30
- gem.add_runtime_dependency "addressable", "~> 2.3"
30
+ gem.add_runtime_dependency "addressable", "~> 2.8"
31
31
  gem.add_runtime_dependency "http-cookie", "~> 1.0"
32
32
  gem.add_runtime_dependency "http-form_data", "~> 2.2"
33
- gem.add_runtime_dependency "http-parser", "~> 1.2.0"
33
+ gem.add_runtime_dependency "llhttp-ffi", "~> 0.4.0"
34
34
 
35
35
  gem.add_development_dependency "bundler", "~> 2.0"
36
36
 
37
37
  gem.metadata = {
38
- "source_code_uri" => "https://github.com/httprb/http",
39
- "wiki_uri" => "https://github.com/httprb/http/wiki",
40
- "bug_tracker_uri" => "https://github.com/httprb/http/issues",
41
- "changelog_uri" => "https://github.com/httprb/http/blob/v#{HTTP::VERSION}/CHANGES.md"
38
+ "source_code_uri" => "https://github.com/httprb/http",
39
+ "wiki_uri" => "https://github.com/httprb/http/wiki",
40
+ "bug_tracker_uri" => "https://github.com/httprb/http/issues",
41
+ "changelog_uri" => "https://github.com/httprb/http/blob/v#{HTTP::VERSION}/CHANGES.md",
42
+ "rubygems_mfa_required" => "true"
42
43
  }
43
44
  end
@@ -9,63 +9,63 @@ module HTTP
9
9
  # Request a get sans response body
10
10
  # @param uri
11
11
  # @option options [Hash]
12
- def head(uri, options = {}) # rubocop:disable Style/OptionHash
12
+ def head(uri, options = {})
13
13
  request :head, uri, options
14
14
  end
15
15
 
16
16
  # Get a resource
17
17
  # @param uri
18
18
  # @option options [Hash]
19
- def get(uri, options = {}) # rubocop:disable Style/OptionHash
19
+ def get(uri, options = {})
20
20
  request :get, uri, options
21
21
  end
22
22
 
23
23
  # Post to a resource
24
24
  # @param uri
25
25
  # @option options [Hash]
26
- def post(uri, options = {}) # rubocop:disable Style/OptionHash
26
+ def post(uri, options = {})
27
27
  request :post, uri, options
28
28
  end
29
29
 
30
30
  # Put to a resource
31
31
  # @param uri
32
32
  # @option options [Hash]
33
- def put(uri, options = {}) # rubocop:disable Style/OptionHash
33
+ def put(uri, options = {})
34
34
  request :put, uri, options
35
35
  end
36
36
 
37
37
  # Delete a resource
38
38
  # @param uri
39
39
  # @option options [Hash]
40
- def delete(uri, options = {}) # rubocop:disable Style/OptionHash
40
+ def delete(uri, options = {})
41
41
  request :delete, uri, options
42
42
  end
43
43
 
44
44
  # Echo the request back to the client
45
45
  # @param uri
46
46
  # @option options [Hash]
47
- def trace(uri, options = {}) # rubocop:disable Style/OptionHash
47
+ def trace(uri, options = {})
48
48
  request :trace, uri, options
49
49
  end
50
50
 
51
51
  # Return the methods supported on the given URI
52
52
  # @param uri
53
53
  # @option options [Hash]
54
- def options(uri, options = {}) # rubocop:disable Style/OptionHash
54
+ def options(uri, options = {})
55
55
  request :options, uri, options
56
56
  end
57
57
 
58
58
  # Convert to a transparent TCP/IP tunnel
59
59
  # @param uri
60
60
  # @option options [Hash]
61
- def connect(uri, options = {}) # rubocop:disable Style/OptionHash
61
+ def connect(uri, options = {})
62
62
  request :connect, uri, options
63
63
  end
64
64
 
65
65
  # Apply partial modifications to a resource
66
66
  # @param uri
67
67
  # @option options [Hash]
68
- def patch(uri, options = {}) # rubocop:disable Style/OptionHash
68
+ def patch(uri, options = {})
69
69
  request :patch, uri, options
70
70
  end
71
71
 
@@ -93,7 +93,7 @@ module HTTP
93
93
  def timeout(options)
94
94
  klass, options = case options
95
95
  when Numeric then [HTTP::Timeout::Global, {:global => options}]
96
- when Hash then [HTTP::Timeout::PerOperation, options]
96
+ when Hash then [HTTP::Timeout::PerOperation, options.dup]
97
97
  when :null then [HTTP::Timeout::Null, {}]
98
98
  else raise ArgumentError, "Use `.timeout(global_timeout_in_seconds)` or `.timeout(connect: x, write: y, read: z)`."
99
99
 
@@ -101,11 +101,12 @@ module HTTP
101
101
 
102
102
  %i[global read write connect].each do |k|
103
103
  next unless options.key? k
104
+
104
105
  options["#{k}_timeout".to_sym] = options.delete k
105
106
  end
106
107
 
107
108
  branch default_options.merge(
108
- :timeout_class => klass,
109
+ :timeout_class => klass,
109
110
  :timeout_options => options
110
111
  )
111
112
  end
@@ -144,9 +145,10 @@ module HTTP
144
145
  options = {:keep_alive_timeout => timeout}
145
146
  p_client = branch default_options.merge(options).with_persistent host
146
147
  return p_client unless block_given?
148
+
147
149
  yield p_client
148
150
  ensure
149
- p_client.close if p_client
151
+ p_client&.close
150
152
  end
151
153
 
152
154
  # Make a request through an HTTP proxy
@@ -168,10 +170,10 @@ module HTTP
168
170
  alias through via
169
171
 
170
172
  # Make client follow redirects.
171
- # @param opts
173
+ # @param options
172
174
  # @return [HTTP::Client]
173
175
  # @see Redirector#initialize
174
- def follow(options = {}) # rubocop:disable Style/OptionHash
176
+ def follow(options = {})
175
177
  branch default_options.with_follow options
176
178
  end
177
179
 
@@ -209,10 +211,11 @@ module HTTP
209
211
  # @option opts [#to_s] :user
210
212
  # @option opts [#to_s] :pass
211
213
  def basic_auth(opts)
212
- user = opts.fetch :user
213
- pass = opts.fetch :pass
214
+ user = opts.fetch(:user)
215
+ pass = opts.fetch(:pass)
216
+ creds = "#{user}:#{pass}"
214
217
 
215
- auth("Basic " + Base64.strict_encode64("#{user}:#{pass}"))
218
+ auth("Basic #{Base64.strict_encode64(creds)}")
216
219
  end
217
220
 
218
221
  # Get options for HTTP
@@ -236,6 +239,9 @@ module HTTP
236
239
  # Turn on given features. Available features are:
237
240
  # * auto_inflate
238
241
  # * auto_deflate
242
+ # * instrumentation
243
+ # * logging
244
+ # * normalize_uri
239
245
  # @param features
240
246
  def use(*features)
241
247
  branch default_options.with_features(features)