http-protocol 0.16.0 → 0.17.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: fb12e7a8d32427098f6c15718572cf392c024930750fb04eba1fd29d14d01880
4
- data.tar.gz: 4b49a2a43e85066a4fef4cdcc28e9b1e66ad09fa882653ef8e28544b251b0e09
3
+ metadata.gz: 192ee24ff847367b1c8f59d6108c6e32a725eddf64284a62e087034a9d4c1a43
4
+ data.tar.gz: bed20c2c1217b0279b9bec642df410a0a7e8ecab0cdbb2975a94a9f6e0dd33f3
5
5
  SHA512:
6
- metadata.gz: 8c8834c64b4dffb5a85b35134cefe1a03c3b8f7fe179bc0e45b6ed12bc87ca22eddd9b34ea5f80e4454ed7374297b7495f51e0f47e61139e5d7b95340090b338
7
- data.tar.gz: '0680483659424dd89bb13bb27fd8cd0200e5f621f5832198530262210b2f2a96adedde8fa22bec124bb74d0a687a67f2d0e09068f50fa3d93524a9ece6f92124'
6
+ metadata.gz: a8d2032762049eeb8fc18ed69bcdcc7b7c7de1ff4108df5a0473b4ee2033e67138f981b866c66f9912a921684073cbec65a3075ce97f95ef7417b8b75927afc9
7
+ data.tar.gz: 39cbcf536e6eb442533586457e87c4295c8d106a6e8fac09cf1b45e2e25bbae5c4fc17a6368ecd1a634cd735f2e2dd264d37c9923f799f014ab35c800c779fd2
@@ -30,6 +30,7 @@ module HTTP
30
30
  KEEP_ALIVE = 'keep-alive'.freeze
31
31
 
32
32
  HOST = 'host'.freeze
33
+ UPGRADE = 'upgrade'.freeze
33
34
 
34
35
  class Headers
35
36
  class Split < Array
@@ -32,6 +32,7 @@ module HTTP
32
32
  @stream = stream
33
33
 
34
34
  @persistent = persistent
35
+ @upgrade = nil
35
36
 
36
37
  @count = 0
37
38
  end
@@ -41,9 +42,18 @@ module HTTP
41
42
  # Whether the connection is persistent.
42
43
  attr :persistent
43
44
 
45
+ # Whether the connection has been upgraded, and to what.
46
+ attr :upgrade
47
+
44
48
  # The number of requests processed.
45
49
  attr :count
46
50
 
51
+ def upgrade?(headers)
52
+ if upgrade = headers[UPGRADE]
53
+ return upgrade.first
54
+ end
55
+ end
56
+
47
57
  def persistent?(version, headers)
48
58
  if version == HTTP10
49
59
  if connection = headers[CONNECTION]
@@ -60,18 +70,29 @@ module HTTP
60
70
  end
61
71
  end
62
72
 
73
+ def upgrade!(protocol)
74
+ @upgrade = protocol
75
+ @persistent = false
76
+
77
+ return @stream
78
+ end
79
+
63
80
  # Write the appropriate header for connection persistence.
64
- def write_persistent_header(version)
65
- if version == HTTP10
66
- @stream.write("connection: keep-alive\r\n") if @persistent
81
+ def write_connection_header(version)
82
+ if @upgrade
83
+ @stream.write("connection: upgrade\r\nupgrade: #{@upgrade}\r\n")
67
84
  else
68
- @stream.write("connection: close\r\n") unless @persistent
85
+ if version == HTTP10
86
+ @stream.write("connection: keep-alive\r\n") if @persistent
87
+ else
88
+ @stream.write("connection: close\r\n") unless @persistent
89
+ end
69
90
  end
70
91
  end
71
92
 
72
93
  # Effectively close the connection and return the underlying IO.
73
94
  # @return [IO] the underlying non-blocking IO.
74
- def hijack
95
+ def hijack!
75
96
  @persistent = false
76
97
 
77
98
  @stream.flush
@@ -89,14 +110,14 @@ module HTTP
89
110
  @stream.write("host: #{authority}\r\n")
90
111
 
91
112
  write_headers(headers)
92
- write_persistent_header(version)
113
+ write_connection_header(version)
93
114
  end
94
115
 
95
116
  def write_response(version, status, headers, body = nil, head = false)
96
117
  @stream.write("#{version} #{status}\r\n")
97
118
 
98
119
  write_headers(headers)
99
- write_persistent_header(version)
120
+ write_connection_header(version)
100
121
  write_body(body, version == HTTP11, head)
101
122
  end
102
123
 
@@ -113,13 +134,7 @@ module HTTP
113
134
  end
114
135
 
115
136
  def read_line
116
- # To support Ruby 2.3, we do the following which is pretty inefficient. Ruby 2.4+ can do the following:
117
- # @stream.gets(CRLF, chomp: true) or raise EOFError
118
- if line = @stream.gets(CRLF)
119
- return line.chomp!(CRLF)
120
- else
121
- raise EOFError
122
- end
137
+ @stream.gets(CRLF, chomp: true) or raise EOFError
123
138
  end
124
139
 
125
140
  def read_request
@@ -127,6 +142,7 @@ module HTTP
127
142
  headers = read_headers
128
143
 
129
144
  @persistent = persistent?(version, headers)
145
+ @upgrade = upgrade?(headers)
130
146
 
131
147
  body = read_request_body(headers)
132
148
 
@@ -183,6 +199,19 @@ module HTTP
183
199
  return chunk
184
200
  end
185
201
 
202
+ def write_upgrade_body
203
+ @stream.write("\r\n")
204
+ @stream.flush
205
+
206
+ return @stream unless block_given?
207
+
208
+ begin
209
+ yield @stream
210
+ rescue
211
+ @stream.close_write
212
+ end
213
+ end
214
+
186
215
  def write_empty_body(body)
187
216
  @stream.write("content-length: 0\r\n\r\n")
188
217
  @stream.flush
@@ -264,6 +293,8 @@ module HTTP
264
293
  def write_body(body, chunked = true, head = false)
265
294
  if body.nil? or body.empty?
266
295
  write_empty_body(body)
296
+ # elsif body.respond_to?(:call)
297
+ # write_upgrade_body(&body)
267
298
  elsif length = body.length
268
299
  write_fixed_length_body(body, length, head)
269
300
  elsif @persistent and chunked
@@ -20,6 +20,6 @@
20
20
 
21
21
  module HTTP
22
22
  module Protocol
23
- VERSION = "0.16.0"
23
+ VERSION = "0.17.0"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http-protocol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.17.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-04-30 00:00:00.000000000 Z
11
+ date: 2019-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-hpack
@@ -143,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
143
  - !ruby/object:Gem::Version
144
144
  version: '0'
145
145
  requirements: []
146
- rubygems_version: 3.0.3
146
+ rubygems_version: 3.0.2
147
147
  signing_key:
148
148
  specification_version: 4
149
149
  summary: Provides abstractions to handle HTTP1 and HTTP2 protocols.