http-protocol 0.16.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
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.