protocol-http1 0.14.6 → 0.15.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.

Potentially problematic release.


This version of protocol-http1 might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a46985e11bfc9d2130f9abceacbd769c4aa83881a1a607afe9d0b4d07ad37e81
4
- data.tar.gz: cb08e884e92c03ab5a05b2d83e75478d458335502222dc89eabf961a43d08ba1
3
+ metadata.gz: c1c040780ba6a7bae3e921d5a7ff40ba5e656ce66d8a138d2c5382ce42efc317
4
+ data.tar.gz: 551dbe0ecbc187b7b3c0c86507d737eace6b41c4f3b62f0d8a7c6f6d8b0bd0a2
5
5
  SHA512:
6
- metadata.gz: 0e78ae57c521f71a09aafec920e852dae0a66068bcc35271029567e053211967e56797e123a6046eb5323a703c6617ca9310d500ead439574c45d6c49c615000
7
- data.tar.gz: aae580287000a506cfd34cfee5ccd00c0ee26194cacf73725462885c37acff442a04ac69ca1ba0a4f4d996fcad2317741773d4a81d2a9cbc1045ecf3270f3053
6
+ metadata.gz: a57fcfd40cf929f6e6a096d07513378b6631d5dbdab25431c9c8763fea9e4a1967e77adc8bddc55a2ca8eb5b3232088bbaf9d0af1fed8dad05af20e3702e4ef2
7
+ data.tar.gz: f736986596addfec4908e05d9bf632f79f906cf1508076ec7e5dd5de1e08efee33c9c1edd512aef50c4f483db92b92481ba68929edbefe454db57b445b969f8c
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2022, by Samuel Williams.
4
+ # Copyright, 2019-2023, by Samuel Williams.
5
5
 
6
6
  require 'protocol/http/body/readable'
7
7
 
@@ -23,6 +23,7 @@ module Protocol
23
23
  end
24
24
 
25
25
  def close(error = nil)
26
+ # If we are closing the body without fully reading it, the underlying connection is now in an undefined state.
26
27
  if @remaining != 0
27
28
  @stream.close
28
29
  end
@@ -30,14 +31,16 @@ module Protocol
30
31
  super
31
32
  end
32
33
 
34
+ # @raises EOFError if the stream is closed before the expected length is read.
33
35
  def read
34
36
  if @remaining > 0
37
+ # `readpartial` will raise `EOFError` if the stream is closed/finished:
35
38
  if chunk = @stream.readpartial(@remaining)
36
39
  @remaining -= chunk.bytesize
37
40
 
38
41
  return chunk
39
- else
40
- raise EOFError, "Stream closed with #{@remaining} bytes remaining!"
42
+ # else
43
+ # raise EOFError, "Stream closed with #{@remaining} bytes remaining!"
41
44
  end
42
45
  end
43
46
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2022, by Samuel Williams.
4
+ # Copyright, 2019-2023, by Samuel Williams.
5
+ # Copyright, 2019, by Brian Morearty.
5
6
  # Copyright, 2020, by Bruno Sutic.
6
7
 
7
8
  require 'protocol/http/headers'
@@ -31,7 +32,7 @@ module Protocol
31
32
  UPGRADE = 'upgrade'
32
33
 
33
34
  # HTTP/1.x request line parser:
34
- TOKEN = /[!#$%&'*+-\.^_`|~0-9a-zA-Z]+/.freeze
35
+ TOKEN = /[!#$%&'*+\-\.\^_`|~0-9a-zA-Z]+/.freeze
35
36
  REQUEST_LINE = /\A(#{TOKEN}) ([^\s]+) (HTTP\/\d.\d)\z/.freeze
36
37
 
37
38
  # HTTP/1.x header parser:
@@ -63,12 +64,6 @@ module Protocol
63
64
  # The number of requests processed.
64
65
  attr :count
65
66
 
66
- def upgrade?(headers)
67
- if upgrade = headers[UPGRADE]
68
- return upgrade
69
- end
70
- end
71
-
72
67
  def persistent?(version, method, headers)
73
68
  if method == HTTP::Methods::CONNECT
74
69
  return false
@@ -281,7 +276,7 @@ module Protocol
281
276
  chunk_length += chunk.bytesize
282
277
 
283
278
  if chunk_length > length
284
- raise Error, "Trying to write #{chunk_length} bytes, but content length was #{length} bytes!"
279
+ raise ContentLengthError, "Trying to write #{chunk_length} bytes, but content length was #{length} bytes!"
285
280
  end
286
281
 
287
282
  @stream.write(chunk)
@@ -291,7 +286,7 @@ module Protocol
291
286
  @stream.flush
292
287
 
293
288
  if chunk_length != length
294
- raise Error, "Wrote #{chunk_length} bytes, but content length was #{length} bytes!"
289
+ raise ContentLengthError, "Wrote #{chunk_length} bytes, but content length was #{length} bytes!"
295
290
  end
296
291
  end
297
292
 
@@ -400,13 +395,19 @@ module Protocol
400
395
  read_remainder_body
401
396
  end
402
397
 
403
- def read_upgrade_body(protocol)
404
- read_remainder_body
405
- end
406
-
407
398
  HEAD = "HEAD"
408
399
  CONNECT = "CONNECT"
409
400
 
401
+ def extract_content_length(headers)
402
+ if content_length = headers.delete(CONTENT_LENGTH)
403
+ if length = Integer(content_length, exception: false) and length >= 0
404
+ yield length
405
+ else
406
+ raise BadRequest, "Invalid content length: #{content_length}"
407
+ end
408
+ end
409
+ end
410
+
410
411
  def read_response_body(method, status, headers)
411
412
  # RFC 7230 3.3.3
412
413
  # 1. Any response to a HEAD request and any response with a 1xx
@@ -415,19 +416,16 @@ module Protocol
415
416
  # header fields, regardless of the header fields present in the
416
417
  # message, and thus cannot contain a message body.
417
418
  if method == HTTP::Methods::HEAD
418
- if content_length = headers.delete(CONTENT_LENGTH)
419
- length = Integer(content_length)
420
-
419
+ extract_content_length(headers) do |length|
421
420
  if length > 0
422
421
  return read_head_body(length)
423
- elsif length == 0
424
- return nil
425
422
  else
426
- raise BadRequest, "Invalid content length: #{content_length}"
423
+ return nil
427
424
  end
428
- else
429
- return nil
430
425
  end
426
+
427
+ # There is no body for a HEAD request if there is no content length:
428
+ return nil
431
429
  end
432
430
 
433
431
  if (status >= 100 and status < 200) or status == 204 or status == 304
@@ -499,14 +497,11 @@ module Protocol
499
497
  # the recipient times out before the indicated number of octets are
500
498
  # received, the recipient MUST consider the message to be
501
499
  # incomplete and close the connection.
502
- if content_length = headers.delete(CONTENT_LENGTH)
503
- length = Integer(content_length)
500
+ extract_content_length(headers) do |length|
504
501
  if length > 0
505
502
  return read_fixed_body(length)
506
- elsif length == 0
507
- return nil
508
503
  else
509
- raise BadRequest, "Invalid content length: #{content_length}"
504
+ return nil
510
505
  end
511
506
  end
512
507
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2019-2022, by Samuel Williams.
4
+ # Copyright, 2019-2023, by Samuel Williams.
5
5
 
6
6
  require 'protocol/http/error'
7
7
 
@@ -13,6 +13,10 @@ module Protocol
13
13
  class InvalidRequest < Error
14
14
  end
15
15
 
16
+ # The specified content length and the given content's length do not match.
17
+ class ContentLengthError < Error
18
+ end
19
+
16
20
  # The request was parsed correctly, but was invalid for some other reason.
17
21
  class BadRequest < Error
18
22
  end
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Protocol
7
7
  module HTTP1
8
- VERSION = "0.14.6"
8
+ VERSION = "0.15.0"
9
9
  end
10
10
  end
data/license.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # MIT License
2
2
 
3
- Copyright, 2019-2022, by Samuel Williams.
3
+ Copyright, 2019-2023, by Samuel Williams.
4
+ Copyright, 2019, by Brian Morearty.
5
+ Copyright, 2020, by Olle Jonsson.
4
6
  Copyright, 2020, by Bruno Sutic.
5
7
 
6
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-http1
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.6
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -40,7 +40,7 @@ cert_chain:
40
40
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
41
41
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
42
42
  -----END CERTIFICATE-----
43
- date: 2022-08-29 00:00:00.000000000 Z
43
+ date: 2023-01-30 00:00:00.000000000 Z
44
44
  dependencies:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: protocol-http
@@ -85,47 +85,19 @@ dependencies:
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  - !ruby/object:Gem::Dependency
88
- name: rspec
88
+ name: sus
89
89
  requirement: !ruby/object:Gem::Requirement
90
90
  requirements:
91
- - - "~>"
92
- - !ruby/object:Gem::Version
93
- version: '3.0'
94
- type: :development
95
- prerelease: false
96
- version_requirements: !ruby/object:Gem::Requirement
97
- requirements:
98
- - - "~>"
99
- - !ruby/object:Gem::Version
100
- version: '3.0'
101
- - !ruby/object:Gem::Dependency
102
- name: rspec-files
103
- requirement: !ruby/object:Gem::Requirement
104
- requirements:
105
- - - "~>"
106
- - !ruby/object:Gem::Version
107
- version: '1.0'
108
- type: :development
109
- prerelease: false
110
- version_requirements: !ruby/object:Gem::Requirement
111
- requirements:
112
- - - "~>"
113
- - !ruby/object:Gem::Version
114
- version: '1.0'
115
- - !ruby/object:Gem::Dependency
116
- name: rspec-memory
117
- requirement: !ruby/object:Gem::Requirement
118
- requirements:
119
- - - "~>"
91
+ - - ">="
120
92
  - !ruby/object:Gem::Version
121
- version: '1.0'
93
+ version: '0'
122
94
  type: :development
123
95
  prerelease: false
124
96
  version_requirements: !ruby/object:Gem::Requirement
125
97
  requirements:
126
- - - "~>"
98
+ - - ">="
127
99
  - !ruby/object:Gem::Version
128
- version: '1.0'
100
+ version: '0'
129
101
  description:
130
102
  email:
131
103
  executables: []
@@ -161,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
133
  - !ruby/object:Gem::Version
162
134
  version: '0'
163
135
  requirements: []
164
- rubygems_version: 3.3.7
136
+ rubygems_version: 3.4.1
165
137
  signing_key:
166
138
  specification_version: 4
167
139
  summary: A low level implementation of the HTTP/1 protocol.
metadata.gz.sig CHANGED
Binary file