protocol-rack 0.2.4 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b6a6be852ed5686a4a29416d5e7f308a0b8fecdac08945f7a94c654fe961295
4
- data.tar.gz: e0afd920038faa59a9739eb0780acc7d517d34fdd9bc336c80069c39b06892e4
3
+ metadata.gz: a51b0412866f66870722a8f62008d4e76df2ba1d613af62b94eea1a30618bd97
4
+ data.tar.gz: 0cc84245f1dbb289cb1081f4c7c291a0bb3d69498b2d822290937418af7dc532
5
5
  SHA512:
6
- metadata.gz: 6d289be5ff94b209e23de3cb3569cfe76df31356daf072e2caf22ec34e22f3dce6e2e46cc027548b515c83ecd6186c1318f74a1bebaed388618ed7c221b704f4
7
- data.tar.gz: 36c188b1011e436f29fdbf2c317d0c81ed46ae1831a1439cad18248492a005f735d14f2babc5855fd455940018c5f26719978878a697794c17d2d35d1846216d
6
+ metadata.gz: ed7a6592a103ecc2f285aa51a83427f29b15fe95cd7488ce57f59878598b833765774db65c5f8563d67e2ac7fe1da01a5f6c58dda6c0e09b34cbdc5fa12d5384
7
+ data.tar.gz: 8182ea7a512bec710d122cdf5ee4f4538b263ef03d2b7eb99130102126c536a58cd2057cf986a9336cad9169eabcffe61ed3c9560d912445a980cdc384311ee8
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, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
5
 
6
6
  require 'console'
7
7
 
@@ -68,6 +68,16 @@ module Protocol
68
68
 
69
69
  self.unwrap_headers(request.headers, env)
70
70
 
71
+ # For the sake of compatibility, we set the `HTTP_UPGRADE` header to the requested protocol.
72
+ if protocol = request.protocol and request.version.start_with?('HTTP/1')
73
+ env[CGI::HTTP_UPGRADE] = Array(protocol).join(",")
74
+ end
75
+
76
+ if request.respond_to?(:hijack?) and request.hijack?
77
+ env[RACK_IS_HIJACK] = true
78
+ env[RACK_HIJACK] = proc{request.hijack!.io.dup}
79
+ end
80
+
71
81
  # HTTP/2 prefers `:authority` over `host`, so we do this for backwards compatibility.
72
82
  env[CGI::HTTP_HOST] ||= request.authority
73
83
 
@@ -78,6 +88,12 @@ module Protocol
78
88
  end
79
89
  end
80
90
 
91
+ def make_environment(request)
92
+ {
93
+ request: request
94
+ }
95
+ end
96
+
81
97
  # Build a rack `env` from the incoming request and apply it to the rack middleware.
82
98
  #
83
99
  # @parameter request [Protocol::HTTP::Request] The incoming request.
@@ -86,6 +102,16 @@ module Protocol
86
102
 
87
103
  status, headers, body = @app.call(env)
88
104
 
105
+ # The status must always be an integer.
106
+ unless status.is_a?(Integer)
107
+ raise ArgumentError, "Status must be an integer!"
108
+ end
109
+
110
+ # Headers must always be a hash or equivalent.
111
+ unless headers
112
+ raise ArgumentError, "Headers must not be nil!"
113
+ end
114
+
89
115
  headers, meta = self.wrap_headers(headers)
90
116
 
91
117
  return Response.wrap(env, status, headers, meta, body, request)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
5
 
6
6
  require 'console'
7
7
 
@@ -17,9 +17,6 @@ module Protocol
17
17
  RACK_MULTIPROCESS = 'rack.multiprocess'
18
18
  RACK_RUN_ONCE = 'rack.run_once'
19
19
 
20
- RACK_IS_HIJACK = 'rack.hijack?'
21
- RACK_HIJACK = 'rack.hijack'
22
-
23
20
  def self.wrap(app)
24
21
  Rewindable.new(self.new(app))
25
22
  end
@@ -108,10 +105,12 @@ module Protocol
108
105
 
109
106
  if key.start_with?('rack.')
110
107
  meta[key] = value
111
- else
108
+ elsif value.is_a?(String)
112
109
  value.split("\n").each do |value|
113
110
  headers[key] = value
114
111
  end
112
+ else
113
+ headers[key] = value
115
114
  end
116
115
  end
117
116
 
@@ -124,7 +123,6 @@ module Protocol
124
123
 
125
124
  if protocol = response.protocol
126
125
  headers['rack.protocol'] = protocol
127
- # headers['upgrade'] = protocol
128
126
  end
129
127
 
130
128
  if body = response.body and body.stream?
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
5
 
6
6
  require 'rack'
7
7
 
@@ -11,7 +11,7 @@ require_relative 'adapter/rack3'
11
11
  module Protocol
12
12
  module Rack
13
13
  module Adapter
14
- if ::Rack::RELEASE >= "3"
14
+ if ::Rack.release >= "3"
15
15
  IMPLEMENTATION = Rack3
16
16
  else
17
17
  IMPLEMENTATION = Rack2
@@ -11,6 +11,7 @@ module Protocol
11
11
  # CGI keys <https://tools.ietf.org/html/rfc3875#section-4.1>:
12
12
  module CGI
13
13
  HTTP_HOST = 'HTTP_HOST'
14
+ HTTP_UPGRADE = "HTTP_UPGRADE"
14
15
  PATH_INFO = 'PATH_INFO'
15
16
  REQUEST_METHOD = 'REQUEST_METHOD'
16
17
  REQUEST_PATH = 'REQUEST_PATH'
@@ -35,5 +36,9 @@ module Protocol
35
36
  RACK_URL_SCHEME = 'rack.url_scheme'
36
37
  RACK_PROTOCOL = 'rack.protocol'
37
38
  RACK_RESPONSE_FINISHED = 'rack.response_finished'
39
+
40
+ # Rack hijack support:
41
+ RACK_IS_HIJACK = 'rack.hijack?'
42
+ RACK_HIJACK = 'rack.hijack'
38
43
  end
39
44
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
+ # Copyright, 2023, by Genki Takiuchi.
5
6
 
6
7
  require 'async/io/buffer'
7
8
  require 'protocol/http/body/stream'
@@ -18,6 +19,7 @@ module Protocol
18
19
  # @parameter body [Protocol::HTTP::Body::Readable]
19
20
  def initialize(body)
20
21
  @body = body
22
+ @closed = false
21
23
 
22
24
  # Will hold remaining data in `#read`.
23
25
  @buffer = nil
@@ -46,6 +48,8 @@ module Protocol
46
48
 
47
49
  # Close the input and output bodies.
48
50
  def close(error = nil)
51
+ @closed = true
52
+
49
53
  if @body
50
54
  @body.close(error)
51
55
  @body = nil
@@ -74,7 +78,7 @@ module Protocol
74
78
 
75
79
  # Whether the stream has been closed.
76
80
  def closed?
77
- @body.nil?
81
+ @closed or @body.nil?
78
82
  end
79
83
 
80
84
  # Whether there are any input chunks remaining?
@@ -87,7 +91,7 @@ module Protocol
87
91
  def read_next
88
92
  if @body
89
93
  @body.read
90
- else
94
+ elsif @closed
91
95
  raise IOError, "Stream is not readable, input has been closed!"
92
96
  end
93
97
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
5
 
6
6
  require 'protocol/http/request'
7
7
  require 'protocol/http/headers'
8
8
 
9
+ require_relative 'constants'
9
10
  require_relative 'body/input_wrapper'
10
11
 
11
12
  module Protocol
@@ -30,19 +31,17 @@ module Protocol
30
31
  )
31
32
  end
32
33
 
33
- HTTP_UPGRADE = 'HTTP_UPGRADE'
34
-
35
34
  def self.protocol(env)
36
35
  if protocols = env['rack.protocol']
37
36
  return Array(protocols)
38
- elsif protocols = env[HTTP_UPGRADE]
37
+ elsif protocols = env[CGI::HTTP_UPGRADE]
39
38
  return protocols.split(/\s*,\s*/)
40
39
  end
41
40
  end
42
41
 
43
42
  def self.headers(env)
44
43
  headers = ::Protocol::HTTP::Headers.new
45
- env.each do |key, value|
44
+ env.each do |key, value|
46
45
  if key.start_with?('HTTP_')
47
46
  next if key == 'HTTP_HOST'
48
47
  headers[key[5..-1].gsub('_', '-').downcase] = value
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2022, by Samuel Williams.
4
+ # Copyright, 2022-2023, by Samuel Williams.
5
5
 
6
6
  module Protocol
7
7
  module Rack
8
- VERSION = "0.2.4"
8
+ VERSION = "0.4.1"
9
9
  end
10
10
  end
data/license.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # MIT License
2
2
 
3
- Copyright, 2022, by Samuel Williams.
3
+ Copyright, 2022-2023, by Samuel Williams.
4
+ Copyright, 2023, by Genki Takiuchi.
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
data/readme.md CHANGED
@@ -71,6 +71,14 @@ We welcome contributions to this project.
71
71
  4. Push to the branch (`git push origin my-new-feature`).
72
72
  5. Create new Pull Request.
73
73
 
74
+ ### Developer Certificate of Origin
75
+
76
+ This project uses the [Developer Certificate of Origin](https://developercertificate.org/). All contributors to this project must agree to this document to have their contributions accepted.
77
+
78
+ ### Contributor Covenant
79
+
80
+ This project is governed by [Contributor Covenant](https://www.contributor-covenant.org/). All contributors and participants agree to abide by its terms.
81
+
74
82
  ## See Also
75
83
 
76
84
  - [protocol-http](https://github.com/socketry/protocol-http) — General abstractions for HTTP client/server implementations.
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,10 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protocol-rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
+ - Genki Takiuchi
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain:
@@ -37,7 +38,7 @@ cert_chain:
37
38
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
39
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
40
  -----END CERTIFICATE-----
40
- date: 2022-09-06 00:00:00.000000000 Z
41
+ date: 2023-12-11 00:00:00.000000000 Z
41
42
  dependencies:
42
43
  - !ruby/object:Gem::Dependency
43
44
  name: protocol-http
@@ -67,90 +68,6 @@ dependencies:
67
68
  - - ">="
68
69
  - !ruby/object:Gem::Version
69
70
  version: '1.0'
70
- - !ruby/object:Gem::Dependency
71
- name: async-http
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: '0.59'
77
- type: :development
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: '0.59'
84
- - !ruby/object:Gem::Dependency
85
- name: bake-test
86
- requirement: !ruby/object:Gem::Requirement
87
- requirements:
88
- - - "~>"
89
- - !ruby/object:Gem::Version
90
- version: '0.1'
91
- type: :development
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - "~>"
96
- - !ruby/object:Gem::Version
97
- version: '0.1'
98
- - !ruby/object:Gem::Dependency
99
- name: bake-test-external
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: '0.1'
105
- type: :development
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: '0.1'
112
- - !ruby/object:Gem::Dependency
113
- name: covered
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - "~>"
117
- - !ruby/object:Gem::Version
118
- version: '0.16'
119
- type: :development
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - "~>"
124
- - !ruby/object:Gem::Version
125
- version: '0.16'
126
- - !ruby/object:Gem::Dependency
127
- name: sus
128
- requirement: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - "~>"
131
- - !ruby/object:Gem::Version
132
- version: '0.12'
133
- type: :development
134
- prerelease: false
135
- version_requirements: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - "~>"
138
- - !ruby/object:Gem::Version
139
- version: '0.12'
140
- - !ruby/object:Gem::Dependency
141
- name: sus-fixtures-async-http
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - "~>"
145
- - !ruby/object:Gem::Version
146
- version: '0.1'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: '0.1'
154
71
  description:
155
72
  email:
156
73
  executables: []
@@ -186,14 +103,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
103
  requirements:
187
104
  - - ">="
188
105
  - !ruby/object:Gem::Version
189
- version: '2.5'
106
+ version: '3.0'
190
107
  required_rubygems_version: !ruby/object:Gem::Requirement
191
108
  requirements:
192
109
  - - ">="
193
110
  - !ruby/object:Gem::Version
194
111
  version: '0'
195
112
  requirements: []
196
- rubygems_version: 3.3.7
113
+ rubygems_version: 3.4.22
197
114
  signing_key:
198
115
  specification_version: 4
199
116
  summary: An implementation of the Rack protocol/specification.
metadata.gz.sig CHANGED
Binary file