protocol-http 0.3.0 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15b85751f04e7fa40248ed85dc937f2c33cd787602ab98f2794538a0cec1c344
4
- data.tar.gz: 9a9b91043c2116ed6ef940b5900104a89ea4392ec00f625d59f85d8173302afe
3
+ metadata.gz: 152ed75f85cb113b719ac90857bcd9e1cc0a8e87ae509c552a1de0086817295e
4
+ data.tar.gz: 48b3bef0834d0eb325433b53007a44b9d57f1b327301ac427ab9ef7303e8f11e
5
5
  SHA512:
6
- metadata.gz: 644d4523b67479376df035a027ef38e4f52d2010336ca5890b7a34ace8444500f96c7e74895989ba959d8ca8f66185353b6793b107372589958497e19bc236e5
7
- data.tar.gz: 4cc9eadf0db696beee04516b7a03f1363c93c962220dd1307af8d54fd4b2766063ade1cb9a472a6abf9b57a8192ad1b75bf0dff32aeb2343c4637068e6b1609f
6
+ metadata.gz: a71ba59c41375ab3002b65a4d7bc517ccb45e5a7d44b0a9e6e7fce7bb80806ecc9c60bf102619cfb32629642d609bda5cb92ca1dee51768dc90ff32173da7ad1
7
+ data.tar.gz: 7483f5278eb4d49b646eca43aabd38717f183359ef0be143c670fee21b2fcd993c721c36340923d74242c8b8cd207414fe146ab9ceea534c3e41fb8e54145671
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Protocol::HTTP
2
2
 
3
- Provides abstractions for working with the HTTP protocol with a focus on on HTTP/2.
3
+ Provides abstractions for working with the HTTP protocol.
4
4
 
5
5
  [![Build Status](https://secure.travis-ci.com/socketry/protocol-http.svg)](http://travis-ci.com/socketry/protocol-http)
6
6
 
@@ -70,7 +70,6 @@ parameters = Protocol::HTTP::URL.decode(reference.query_string)
70
70
  Released under the MIT license.
71
71
 
72
72
  Copyright, 2019, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
73
- Copyright, 2013, by Ilya Grigorik.
74
73
 
75
74
  Permission is hereby granted, free of charge, to any person obtaining a copy
76
75
  of this software and associated documentation files (the "Software"), to deal
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
2
+ #
1
3
  # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- # Copyright, 2013, by Ilya Grigorik.
3
4
  #
4
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
6
  # of this software and associated documentation files (the "Software"), to deal
@@ -21,6 +22,7 @@
21
22
 
22
23
  module Protocol
23
24
  module HTTP
25
+ # A generic, HTTP protocol error.
24
26
  class Error < StandardError
25
27
  end
26
28
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ #
1
3
  # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -22,7 +24,7 @@ module Protocol
22
24
  module HTTP
23
25
  # Headers are an array of key-value pairs. Some header keys represent multiple values.
24
26
  class Headers
25
- # Split by commas.
27
+ # Header value which is split by commas.
26
28
  class Split < Array
27
29
  COMMA = /\s*,\s*/
28
30
 
@@ -31,7 +33,7 @@ module Protocol
31
33
  end
32
34
 
33
35
  def << value
34
- super value.split(COMMA)
36
+ self.push(*value.split(COMMA))
35
37
  end
36
38
 
37
39
  def to_s
@@ -39,7 +41,7 @@ module Protocol
39
41
  end
40
42
  end
41
43
 
42
- # Split by newline charaters.
44
+ # Header value which is split by newline charaters (e.g. cookies).
43
45
  class Multiple < Array
44
46
  def initialize(value)
45
47
  super()
@@ -80,9 +82,12 @@ module Protocol
80
82
  def freeze
81
83
  return if frozen?
82
84
 
83
- # Generate @indexed
85
+ # Ensure @indexed is generated:
84
86
  self.to_h
85
87
 
88
+ @fields.freeze
89
+ @indexed.freeze
90
+
86
91
  super
87
92
  end
88
93
 
@@ -222,21 +227,28 @@ module Protocol
222
227
  end
223
228
 
224
229
  def == other
225
- if other.is_a? Hash
230
+ case other
231
+ when Hash
226
232
  to_h == other
227
- else
233
+ when Headers
228
234
  @fields == other.fields
235
+ else
236
+ @fields == other
229
237
  end
230
238
  end
231
239
 
232
240
  # Used for merging objects into a sequential list of headers. Normalizes header keys and values.
233
241
  class Merged
242
+ include Enumerable
243
+
234
244
  def initialize(*all)
235
245
  @all = all
236
246
  end
237
247
 
238
248
  def << headers
239
249
  @all << headers
250
+
251
+ return self
240
252
  end
241
253
 
242
254
  # @yield [String, String] header key (lower case) and value (as string).
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ #
1
3
  # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -22,16 +24,16 @@ module Protocol
22
24
  module HTTP
23
25
  # HTTP method verbs
24
26
  module Methods
25
- GET = 'GET'.freeze
26
- POST = 'POST'.freeze
27
- PUT = 'PUT'.freeze
28
- PATCH = 'PATCH'.freeze
29
- DELETE = 'DELETE'.freeze
30
- HEAD = 'HEAD'.freeze
31
- OPTIONS = 'OPTIONS'.freeze
32
- LINK = 'LINK'.freeze
33
- UNLINK = 'UNLINK'.freeze
34
- TRACE = 'TRACE'.freeze
27
+ GET = 'GET'
28
+ POST = 'POST'
29
+ PUT = 'PUT'
30
+ PATCH = 'PATCH'
31
+ DELETE = 'DELETE'
32
+ HEAD = 'HEAD'
33
+ OPTIONS = 'OPTIONS'
34
+ LINK = 'LINK'
35
+ UNLINK = 'UNLINK'
36
+ TRACE = 'TRACE'
35
37
 
36
38
  # Use Methods.constants to get all constants.
37
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ #
1
3
  # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -24,6 +26,8 @@ module Protocol
24
26
  module HTTP
25
27
  # A relative reference, excluding any authority.
26
28
  class Reference
29
+ include Comparable
30
+
27
31
  # Generate a reference from a path and user parameters. The path may contain a `#fragment` or `?query=parameters`.
28
32
  def self.parse(path = '/', parameters = nil)
29
33
  base, fragment = path.split('#', 2)
@@ -32,32 +36,51 @@ module Protocol
32
36
  self.new(path, query_string, fragment, parameters)
33
37
  end
34
38
 
35
- def initialize(path, query_string = nil, fragment = nil, parameters = nil)
39
+ def initialize(path = '/', query_string = nil, fragment = nil, parameters = nil)
36
40
  @path = path
37
41
  @query_string = query_string
38
42
  @fragment = fragment
39
43
  @parameters = parameters
40
44
  end
41
45
 
42
- def self.[] reference
43
- if reference.is_a? self
44
- return reference
45
- else
46
- return self.parse(reference)
47
- end
48
- end
49
-
50
46
  # The path component, e.g. /foo/bar/index.html
51
- attr :path
47
+ attr_accessor :path
52
48
 
53
49
  # The un-parsed query string, e.g. 'x=10&y=20'
54
- attr :query_string
50
+ attr_accessor :query_string
55
51
 
56
52
  # A fragment, the part after the '#'
57
- attr :fragment
53
+ attr_accessor :fragment
58
54
 
59
55
  # User supplied parameters that will be appended to the query part.
60
- attr :parameters
56
+ attr_accessor :parameters
57
+
58
+ def freeze
59
+ return self if frozen?
60
+
61
+ @path.freeze
62
+ @query_string.freeze
63
+ @fragment.freeze
64
+ @parameters.freeze
65
+
66
+ super
67
+ end
68
+
69
+ def to_ary
70
+ [@path, @query_string, @fragment, @parameters]
71
+ end
72
+
73
+ def <=> other
74
+ to_ary <=> other.to_ary
75
+ end
76
+
77
+ def self.[] reference
78
+ if reference.is_a? self
79
+ return reference
80
+ else
81
+ return self.parse(reference)
82
+ end
83
+ end
61
84
 
62
85
  def parameters?
63
86
  @parameters and !@parameters.empty?
@@ -104,12 +127,8 @@ module Protocol
104
127
  )
105
128
  end
106
129
 
107
- def [] parameters
108
- self.dup(nil, parameters)
109
- end
110
-
111
130
  def dup(path = nil, parameters = nil, merge = true)
112
- if @parameters and merge
131
+ if merge and @parameters
113
132
  if parameters
114
133
  parameters = @parameters.merge(parameters)
115
134
  else
@@ -132,7 +151,9 @@ module Protocol
132
151
  if relative.start_with? '/'
133
152
  return relative
134
153
  else
135
- path = base.split('/')
154
+ path = base.split('/', -1)
155
+ path.pop
156
+
136
157
  parts = relative.split('/')
137
158
 
138
159
  parts.each do |part|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+ #
1
3
  # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
4
  #
3
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Protocol
22
22
  module HTTP
23
- VERSION = "0.3.0"
23
+ VERSION = "0.4.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-10 00:00:00.000000000 Z
11
+ date: 2019-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: covered
@@ -81,7 +81,6 @@ files:
81
81
  - README.md
82
82
  - Rakefile
83
83
  - lib/protocol/http.rb
84
- - lib/protocol/http/cgi.rb
85
84
  - lib/protocol/http/error.rb
86
85
  - lib/protocol/http/headers.rb
87
86
  - lib/protocol/http/methods.rb
@@ -1,44 +0,0 @@
1
- # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- module Protocol
22
- module HTTP
23
- # CGI keys (https://tools.ietf.org/html/rfc3875#section-4.1)
24
- module CGI
25
- AUTH_TYPE = "AUTH_TYPE".freeze
26
- CONTENT_LENGTH = "CONTENT_LENGTH".freeze
27
- CONTENT_TYPE = "CONTENT_TYPE".freeze
28
- GATEWAY_INTERFACE = "GATEWAY_INTERFACE".freeze
29
- PATH_INFO = "PATH_INFO".freeze
30
- PATH_TRANSLATED = "PATH_TRANSLATED".freeze
31
- QUERY_STRING = "QUERY_STRING".freeze
32
- REMOTE_ADDR = "REMOTE_ADDR".freeze
33
- REMOTE_HOST = "REMOTE_HOST".freeze
34
- REMOTE_IDENT = "REMOTE_IDENT".freeze
35
- REMOTE_USER = "REMOTE_USER".freeze
36
- REQUEST_METHOD = "REQUEST_METHOD".freeze
37
- SCRIPT_NAME = "SCRIPT_NAME".freeze
38
- SERVER_NAME = "SERVER_NAME".freeze
39
- SERVER_PORT = "SERVER_PORT".freeze
40
- SERVER_PROTOCOL = "SERVER_PROTOCOL".freeze
41
- SERVER_SOFTWARE = "SERVER_SOFTWARE".freeze
42
- end
43
- end
44
- end