net-http-server 0.2.0 → 0.2.3
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 +7 -0
- data/.gitignore +1 -0
- data/ChangeLog.md +27 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +1 -1
- data/README.md +29 -17
- data/Rakefile +11 -28
- data/gemspec.yml +10 -4
- data/lib/net/http/server/chunked_stream.rb +4 -5
- data/lib/net/http/server/daemon.rb +17 -17
- data/lib/net/http/server/parser.rb +18 -18
- data/lib/net/http/server/requests.rb +5 -10
- data/lib/net/http/server/responses.rb +2 -2
- data/lib/net/http/server/server.rb +16 -13
- data/lib/net/http/server/version.rb +1 -1
- data/lib/rack/handler/http.rb +16 -17
- data/net-http-server.gemspec +40 -109
- data/spec/net/http/server/chunked_stream_spec.rb +10 -10
- data/spec/net/http/server/daemon_spec.rb +9 -11
- data/spec/net/http/server/parser_spec.rb +23 -23
- data/spec/net/http/server/requests_spec.rb +12 -26
- data/spec/net/http/server/responses_spec.rb +17 -17
- data/spec/net/http/server/stream_spec.rb +6 -6
- data/spec/rack/handler/helpers/test_request.rb +12 -3
- data/spec/rack/handler/http_spec.rb +27 -26
- data/spec/spec_helper.rb +0 -1
- metadata +49 -46
- data/.gemtest +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 35d57af683a4c0b327c281d5ae71f848e076b6be987e9fa4c1ee77d2aab41d68
|
4
|
+
data.tar.gz: 6cd05ef1952687d1ec6b0ac83bfe3ca7ba457fae04891a38fb32b53beee7beb7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 87305fc9592d5cde9ab305b0a98d22f365fc6af32808aca03323f0d0140b89384a95b9e19b5ccc23552ae611b65b600d02ad526b399d4d606793d7d0cfbd308b
|
7
|
+
data.tar.gz: ad2a7320a5aeb3b2106cf4b871fb589dd2f0ad0afb86d50ad9a41b75e88f76f7ef0115c2d78b450fc42020f4da4bc58d1605de83e43df464bddf2c49f50b7cb2
|
data/.gitignore
CHANGED
data/ChangeLog.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
### 0.2.3 / 2022-06-18
|
2
|
+
|
3
|
+
* Add [gserver] ~> 0.0 as a dependency.
|
4
|
+
* Switched to using Ruby 2.x keyword arguments.
|
5
|
+
* Fix a bug in {Rack::Handler::HTTP} where the URI `query` string was not being
|
6
|
+
properly loaded.
|
7
|
+
* Fixed a bug in {Net::HTTP::Server::Parser} where the older `absnt?` method
|
8
|
+
was being used instead of the newer `absent?` method.
|
9
|
+
|
10
|
+
### 0.2.2 / 2012-09-08
|
11
|
+
|
12
|
+
* Added an example `rackup` command.
|
13
|
+
|
14
|
+
#### Parser
|
15
|
+
|
16
|
+
* Fixed the rule for escaped unicode characters (`%uXXXX`).
|
17
|
+
* Added a rule for escaped characters (`%XX`).
|
18
|
+
|
19
|
+
### 0.2.1 / 2011-10-14
|
20
|
+
|
21
|
+
* Adjusted {Net::HTTP::Server::Parser} to include the leading `/` in the
|
22
|
+
`:path`.
|
23
|
+
* Use `String#replace` to clear the buffer passed to
|
24
|
+
{Net::HTTP::Server::ChunkedStream#read}.
|
25
|
+
|
1
26
|
### 0.2.0 / 2011-08-23
|
2
27
|
|
3
28
|
* Added support for handling Streams and Chunked Transfer-Encoding:
|
@@ -16,3 +41,5 @@
|
|
16
41
|
* Added {Net::HTTP::Server::Responses}.
|
17
42
|
* Added {Net::HTTP::Server::Daemon}.
|
18
43
|
* Added {Rack::Handler::HTTP}.
|
44
|
+
|
45
|
+
[gserver]: https://rubygems.org/gems/gserver
|
data/Gemfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rubygems-tasks', '~> 0.1'
|
8
|
+
|
9
|
+
gem 'rack'
|
10
|
+
gem 'rspec', '~> 3.0'
|
11
|
+
|
12
|
+
gem 'kramdown'
|
13
|
+
gem 'redcarpet', platform: :mri
|
14
|
+
gem 'yard', '~> 0.9'
|
15
|
+
gem 'yard-spellcheck'
|
16
|
+
end
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
# net-http-server
|
2
2
|
|
3
|
-
* [Homepage](
|
4
|
-
* [Issues](
|
5
|
-
* [Documentation](
|
6
|
-
* [Email](mailto:postmodern.mod3 at gmail.com)
|
3
|
+
* [Homepage](https://github.com/postmodern/net-http-server#readme)
|
4
|
+
* [Issues](https://github.com/postmodern/net-http-server/issues)
|
5
|
+
* [Documentation](https://rubydoc.info/gems/net-http-server)
|
7
6
|
|
8
7
|
## Description
|
9
8
|
|
@@ -14,37 +13,50 @@
|
|
14
13
|
* Pure Ruby.
|
15
14
|
* Supports Streamed Request/Response Bodies.
|
16
15
|
* Supports Chunked Transfer-Encoding.
|
17
|
-
* Provides a [Rack](
|
16
|
+
* Provides a [Rack](https://github.com/rack/rack#readme) Handler.
|
18
17
|
|
19
18
|
## Examples
|
20
19
|
|
21
20
|
Simple HTTP Server:
|
22
21
|
|
23
|
-
|
24
|
-
|
22
|
+
```ruby
|
23
|
+
require 'net/http/server'
|
24
|
+
require 'pp'
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
Net::HTTP::Server.run(:port => 8080) do |request,stream|
|
27
|
+
pp request
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
[200, {'Content-Type' => 'text/html'}, ['Hello World']]
|
30
|
+
end
|
31
|
+
```
|
31
32
|
|
32
33
|
Use it with Rack:
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
|
35
|
+
```ruby
|
36
|
+
require 'rack/handler/http'
|
37
|
+
|
38
|
+
Rack::Handler::HTTP.run app
|
39
|
+
```
|
40
|
+
|
41
|
+
Using it with `rackup`:
|
42
|
+
|
43
|
+
```shell
|
44
|
+
$ rackup -s HTTP
|
45
|
+
```
|
37
46
|
|
38
47
|
## Requirements
|
39
48
|
|
40
|
-
* [parslet](http://
|
49
|
+
* [parslet](http://kschiess.github.io/parslet/) ~> 1.0
|
50
|
+
* [gserver](https://rubygems.org/gems/gserver) ~> 0.0
|
41
51
|
|
42
52
|
## Install
|
43
53
|
|
44
|
-
|
54
|
+
```shell
|
55
|
+
$ gem install net-http-server
|
56
|
+
```
|
45
57
|
|
46
58
|
## Copyright
|
47
59
|
|
48
|
-
Copyright (c) 2011 Hal Brodigan
|
60
|
+
Copyright (c) 2011-2022 Hal Brodigan
|
49
61
|
|
50
62
|
See {file:LICENSE.txt} for details.
|
data/Rakefile
CHANGED
@@ -1,36 +1,19 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
|
4
1
|
begin
|
5
|
-
|
6
|
-
require 'ore/tasks'
|
7
|
-
|
8
|
-
Ore::Tasks.new
|
2
|
+
require 'bundler/setup'
|
9
3
|
rescue LoadError => e
|
10
4
|
warn e.message
|
11
|
-
warn "Run `gem install
|
5
|
+
warn "Run `gem install bundler` to install Bundler"
|
6
|
+
exit -1
|
12
7
|
end
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
require 'rspec/core/rake_task'
|
9
|
+
require 'rubygems/tasks'
|
10
|
+
Gem::Tasks.new
|
17
11
|
|
18
|
-
|
19
|
-
|
20
|
-
task :spec do
|
21
|
-
abort "Please run `gem install rspec` to install RSpec."
|
22
|
-
end
|
23
|
-
end
|
24
|
-
task :test => :spec
|
25
|
-
task :default => :spec
|
12
|
+
require 'rspec/core/rake_task'
|
13
|
+
RSpec::Core::RakeTask.new
|
26
14
|
|
27
|
-
|
28
|
-
|
29
|
-
require 'yard'
|
15
|
+
task :test => :spec
|
16
|
+
task :default => :spec
|
30
17
|
|
31
|
-
|
32
|
-
|
33
|
-
task :yard do
|
34
|
-
abort "Please run `gem install yard` to install YARD."
|
35
|
-
end
|
36
|
-
end
|
18
|
+
require 'yard'
|
19
|
+
YARD::Rake::YardocTask.new
|
data/gemspec.yml
CHANGED
@@ -4,13 +4,19 @@ description: A Rack compatible pure Ruby HTTP Server.
|
|
4
4
|
license: MIT
|
5
5
|
authors: Postmodern
|
6
6
|
email: postmodern.mod3@gmail.com
|
7
|
-
homepage:
|
7
|
+
homepage: https://github.com/postmodern/net-http-server#readme
|
8
8
|
has_yard: true
|
9
9
|
|
10
|
+
metadata:
|
11
|
+
documentation_uri: https://rubydoc.info/gems/net-http-server
|
12
|
+
source_code_uri: https://github.com/postmodern/net-http-server
|
13
|
+
bug_tracker_uri: https://github.com/postmodern/net-http-server/issues
|
14
|
+
changelog_uri: https://github.com/postmodern/net-http-server/blob/master/ChangeLog.md
|
15
|
+
rubygems_mfa_required: 'true'
|
16
|
+
|
10
17
|
dependencies:
|
11
18
|
parslet: ~> 1.0
|
19
|
+
gserver: ~> 0.0
|
12
20
|
|
13
21
|
development_dependencies:
|
14
|
-
|
15
|
-
rspec: ~> 2.4
|
16
|
-
yard: ~> 0.6.0
|
22
|
+
bundler: ~> 2.0
|
@@ -14,7 +14,7 @@ module Net
|
|
14
14
|
class ChunkedStream < Stream
|
15
15
|
|
16
16
|
#
|
17
|
-
# Initializes the
|
17
|
+
# Initializes the chunked stream.
|
18
18
|
#
|
19
19
|
# @param [#read, #write, #flush] socket
|
20
20
|
# The socket to read from and write to.
|
@@ -47,9 +47,8 @@ module Net
|
|
47
47
|
end
|
48
48
|
|
49
49
|
until @buffer.length >= length
|
50
|
-
length_line
|
51
|
-
chunk_length
|
52
|
-
chunk_length = chunk_length.to_i(16)
|
50
|
+
length_line = @socket.readline("\r\n").chomp
|
51
|
+
chunk_length = length_line.split(';',2).first.to_i(16)
|
53
52
|
|
54
53
|
# read the chunk
|
55
54
|
@buffer << @socket.read(chunk_length)
|
@@ -62,7 +61,7 @@ module Net
|
|
62
61
|
end
|
63
62
|
|
64
63
|
# clear the buffer before appending
|
65
|
-
buffer.
|
64
|
+
buffer.replace('')
|
66
65
|
|
67
66
|
unless @buffer.empty?
|
68
67
|
# empty a slice of the buffer
|
@@ -26,22 +26,19 @@ module Net
|
|
26
26
|
|
27
27
|
# Creates a new HTTP Daemon.
|
28
28
|
#
|
29
|
-
# @param [
|
30
|
-
# Options for the daemon.
|
31
|
-
#
|
32
|
-
# @option options [String] :host (DEFAULT_HOST)
|
29
|
+
# @param [String] host
|
33
30
|
# The host to run on.
|
34
31
|
#
|
35
|
-
# @
|
32
|
+
# @param [String] port
|
36
33
|
# The port to listen on.
|
37
34
|
#
|
38
|
-
# @
|
35
|
+
# @param [Integer] max_connections
|
39
36
|
# The maximum number of simultaneous connections.
|
40
37
|
#
|
41
|
-
# @
|
38
|
+
# @param [IO] log
|
42
39
|
# The log to write errors to.
|
43
40
|
#
|
44
|
-
# @
|
41
|
+
# @param [#call] handler
|
45
42
|
# The HTTP Request Handler object.
|
46
43
|
#
|
47
44
|
# @yield [request, socket]
|
@@ -53,15 +50,18 @@ module Net
|
|
53
50
|
# @yieldparam [TCPSocket] socket
|
54
51
|
# The TCP socket of the client.
|
55
52
|
#
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
# @raise [ArgumentError]
|
54
|
+
# No `handler:` value was given.
|
55
|
+
#
|
56
|
+
def initialize(host: DEFAULT_HOST,
|
57
|
+
port: DEFAULT_PORT,
|
58
|
+
max_connections: MAX_CONNECTIONS,
|
59
|
+
log: $stderr,
|
60
|
+
handler: nil,
|
61
|
+
&block)
|
62
|
+
super(port.to_i,host,max_connections,log,false,true)
|
63
63
|
|
64
|
-
handler(
|
64
|
+
handler(handler,&block)
|
65
65
|
end
|
66
66
|
|
67
67
|
#
|
@@ -106,7 +106,7 @@ module Net
|
|
106
106
|
|
107
107
|
begin
|
108
108
|
request = parser.parse(raw_request)
|
109
|
-
rescue Parslet::ParseFailed
|
109
|
+
rescue Parslet::ParseFailed
|
110
110
|
return Responses::BAD_REQUEST
|
111
111
|
end
|
112
112
|
|
@@ -9,7 +9,7 @@ module Net
|
|
9
9
|
#
|
10
10
|
# * [Thin](https://github.com/macournoyer/thin/blob/master/ext/thin_parser/common.rl)
|
11
11
|
# * [Unicorn](https://github.com/defunkt/unicorn/blob/master/ext/unicorn_http/unicorn_http_common.rl)
|
12
|
-
# * [RFC
|
12
|
+
# * [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html)
|
13
13
|
#
|
14
14
|
class Parser < Parslet::Parser
|
15
15
|
|
@@ -30,7 +30,7 @@ module Net
|
|
30
30
|
rule(:crlf) { str("\r\n") }
|
31
31
|
|
32
32
|
rule(:ctl) { cntrl | str("\x7f") }
|
33
|
-
rule(:text) { lws | (ctl.
|
33
|
+
rule(:text) { lws | (ctl.absent? >> ascii) }
|
34
34
|
|
35
35
|
rule(:safe) { charset('$', '-', '_', '.') }
|
36
36
|
rule(:extra) { charset('!', '*', "'", '(', ')', ',') }
|
@@ -39,12 +39,13 @@ module Net
|
|
39
39
|
|
40
40
|
rule(:unsafe) { ctl | charset(' ', '#', '%') | sorta_safe }
|
41
41
|
rule(:national) {
|
42
|
-
(alpha | digit | reserved | extra | safe | unsafe).
|
42
|
+
(alpha | digit | reserved | extra | safe | unsafe).absent? >> any
|
43
43
|
}
|
44
44
|
|
45
45
|
rule(:unreserved) { alpha | digit | safe | extra | national }
|
46
|
-
rule(:
|
47
|
-
rule(:
|
46
|
+
rule(:uescape) { str("%u") >> xdigit >> xdigit >> xdigit >> xdigit }
|
47
|
+
rule(:escape) { str("%") >> xdigit >> xdigit }
|
48
|
+
rule(:uchar) { unreserved | uescape | escape | sorta_safe }
|
48
49
|
rule(:pchar) { uchar | charset(':', '@', '&', '=', '+') }
|
49
50
|
rule(:separators) {
|
50
51
|
lws | charset(
|
@@ -56,13 +57,13 @@ module Net
|
|
56
57
|
#
|
57
58
|
# Elements
|
58
59
|
#
|
59
|
-
rule(:token) { (ctl | separators).
|
60
|
+
rule(:token) { (ctl | separators).absent? >> ascii }
|
60
61
|
|
61
|
-
rule(:comment_text) { (str('(') | str(')')).
|
62
|
+
rule(:comment_text) { (str('(') | str(')')).absent? >> text }
|
62
63
|
rule(:comment) { str('(') >> comment_text.repeat >> str(')') }
|
63
64
|
|
64
65
|
rule(:quoted_pair) { str("\\") >> ascii }
|
65
|
-
rule(:quoted_text) { quoted_pair | str('"').
|
66
|
+
rule(:quoted_text) { quoted_pair | str('"').absent? >> text }
|
66
67
|
rule(:quoted_string) { str('"') >> quoted_text >> str('"') }
|
67
68
|
|
68
69
|
#
|
@@ -86,23 +87,22 @@ module Net
|
|
86
87
|
rule(:params) { param >> (str(';') >> param).repeat }
|
87
88
|
rule(:frag) { (uchar | reserved).repeat }
|
88
89
|
|
89
|
-
rule(:
|
90
|
-
path.maybe.as(:path) >>
|
90
|
+
rule(:uri_path) {
|
91
|
+
(str('/').maybe >> path.maybe).as(:path) >>
|
91
92
|
(str(';') >> params.as(:params)).maybe >>
|
92
93
|
(str('?') >> query_string.as(:query)).maybe >>
|
93
94
|
(str('#') >> frag.as(:fragment)).maybe
|
94
95
|
}
|
95
|
-
rule(:absolute_path) { str('/').repeat(1) >> relative_path }
|
96
96
|
|
97
|
-
rule(:
|
97
|
+
rule(:uri) {
|
98
98
|
scheme.as(:scheme) >> str(':') >> str('//').maybe >>
|
99
99
|
(user_info.as(:user_info) >> str('@')).maybe >>
|
100
100
|
host_name.as(:host) >>
|
101
101
|
(str(':') >> digits.as(:port)).maybe >>
|
102
|
-
|
102
|
+
uri_path
|
103
103
|
}
|
104
104
|
|
105
|
-
rule(:request_uri) { str('*') |
|
105
|
+
rule(:request_uri) { str('*') | uri | uri_path }
|
106
106
|
|
107
107
|
#
|
108
108
|
# HTTP Elements
|
@@ -112,12 +112,12 @@ module Net
|
|
112
112
|
rule(:version_number) { digits >> str('.') >> digits }
|
113
113
|
rule(:http_version) { str('HTTP/') >> version_number.as(:version) }
|
114
114
|
rule(:request_line) {
|
115
|
-
request_method.as(:method) >>
|
116
|
-
|
117
|
-
|
115
|
+
request_method.as(:method) >> str(' ') >>
|
116
|
+
request_uri.as(:uri) >> str(' ') >>
|
117
|
+
http_version
|
118
118
|
}
|
119
119
|
|
120
|
-
rule(:header_name) { (str(':').
|
120
|
+
rule(:header_name) { (str(':').absent? >> token).repeat(1) }
|
121
121
|
rule(:header_value) {
|
122
122
|
(text | token | separators | quoted_string).repeat(1)
|
123
123
|
}
|
@@ -7,7 +7,7 @@ module Net
|
|
7
7
|
# Default ports for common URI schemes
|
8
8
|
DEFAULT_PORTS = {
|
9
9
|
'https' => 443,
|
10
|
-
'http'
|
10
|
+
'http' => 80
|
11
11
|
}
|
12
12
|
|
13
13
|
protected
|
@@ -65,7 +65,8 @@ module Net
|
|
65
65
|
def normalize_uri(request)
|
66
66
|
uri = request[:uri]
|
67
67
|
|
68
|
-
|
68
|
+
case uri
|
69
|
+
when Hash
|
69
70
|
if uri[:scheme]
|
70
71
|
uri[:port] = unless uri[:port]
|
71
72
|
DEFAULT_PORTS[uri[:scheme]]
|
@@ -73,13 +74,7 @@ module Net
|
|
73
74
|
uri[:port].to_i
|
74
75
|
end
|
75
76
|
end
|
76
|
-
|
77
|
-
unless uri[:path]
|
78
|
-
uri[:path] = '/'
|
79
|
-
else
|
80
|
-
uri[:path].insert(0,'/')
|
81
|
-
end
|
82
|
-
elsif uri == '*'
|
77
|
+
when '*'
|
83
78
|
request[:uri] = {}
|
84
79
|
end
|
85
80
|
end
|
@@ -96,7 +91,7 @@ module Net
|
|
96
91
|
|
97
92
|
unless headers.empty?
|
98
93
|
headers.each do |header|
|
99
|
-
name
|
94
|
+
name = header[:name].to_s
|
100
95
|
value = header[:value].to_s
|
101
96
|
|
102
97
|
if normalized_headers.has_key?(name)
|
@@ -87,7 +87,7 @@ module Net
|
|
87
87
|
# @param [IO] stream
|
88
88
|
# The stream to write the headers back to.
|
89
89
|
#
|
90
|
-
# @param [Hash{String =>
|
90
|
+
# @param [Hash{String => String,Time,Array<String>}] headers
|
91
91
|
# The headers of the HTTP Response.
|
92
92
|
#
|
93
93
|
def write_headers(stream,headers)
|
@@ -155,7 +155,7 @@ module Net
|
|
155
155
|
# @param [Integer] status
|
156
156
|
# The status of the HTTP Response.
|
157
157
|
#
|
158
|
-
# @param [Hash{String =>
|
158
|
+
# @param [Hash{String => String,Time,Array<String>}] headers
|
159
159
|
# The headers of the HTTP Response.
|
160
160
|
#
|
161
161
|
# @param [#each] body
|
@@ -8,23 +8,23 @@ module Net
|
|
8
8
|
#
|
9
9
|
# Starts the HTTP Server.
|
10
10
|
#
|
11
|
-
# @param [
|
12
|
-
#
|
11
|
+
# @param [Boolean] background
|
12
|
+
# Specifies whether to run the server in the background or
|
13
|
+
# foreground.
|
13
14
|
#
|
14
|
-
# @
|
15
|
+
# @param [Hash{Symbol => Object}] kwargs
|
16
|
+
# Additional keyword arguments for {Daemon#initialize}.
|
17
|
+
#
|
18
|
+
# @option kwargs [String] :host (DEFAULT_HOST)
|
15
19
|
# The host to run on.
|
16
20
|
#
|
17
|
-
# @option
|
21
|
+
# @option kwargs [String] :port (DEFAULT_PORT)
|
18
22
|
# The port to listen on.
|
19
23
|
#
|
20
|
-
# @option
|
24
|
+
# @option kwargs [Integer] :max_connections (MAX_CONNECTIONS)
|
21
25
|
# The maximum number of simultaneous connections.
|
22
26
|
#
|
23
|
-
# @option
|
24
|
-
# Specifies whether to run the server in the background or
|
25
|
-
# foreground.
|
26
|
-
#
|
27
|
-
# @option options [#call] :handler
|
27
|
+
# @option kwargs [#call] :handler
|
28
28
|
# The HTTP Request Handler object.
|
29
29
|
#
|
30
30
|
# @yield [request, socket]
|
@@ -36,11 +36,14 @@ module Net
|
|
36
36
|
# @yieldparam [TCPSocket] socket
|
37
37
|
# The TCP socket of the client.
|
38
38
|
#
|
39
|
-
|
40
|
-
|
39
|
+
# @raise [ArgumentError]
|
40
|
+
# No `handler:` value was given.
|
41
|
+
#
|
42
|
+
def Server.run(background: false, **kwargs,&block)
|
43
|
+
daemon = Daemon.new(**kwargs,&block)
|
41
44
|
|
42
45
|
daemon.start
|
43
|
-
daemon.join unless
|
46
|
+
daemon.join unless background
|
44
47
|
return daemon
|
45
48
|
end
|
46
49
|
|
data/lib/rack/handler/http.rb
CHANGED
@@ -37,7 +37,7 @@ module Rack
|
|
37
37
|
# @param [#call] app
|
38
38
|
# The application the handler will be passing requests to.
|
39
39
|
#
|
40
|
-
# @param [Hash] options
|
40
|
+
# @param [Hash{Symbol => Object}] options
|
41
41
|
# Additional options.
|
42
42
|
#
|
43
43
|
# @option options [String] :Host
|
@@ -46,11 +46,10 @@ module Rack
|
|
46
46
|
# @option options [Integer] :Port
|
47
47
|
# The port to listen on.
|
48
48
|
#
|
49
|
-
def initialize(app
|
50
|
-
@app
|
49
|
+
def initialize(app,**options)
|
50
|
+
@app = app
|
51
51
|
@options = options
|
52
|
-
|
53
|
-
@server = nil
|
52
|
+
@server = nil
|
54
53
|
end
|
55
54
|
|
56
55
|
#
|
@@ -58,8 +57,8 @@ module Rack
|
|
58
57
|
#
|
59
58
|
# @see #initialize
|
60
59
|
#
|
61
|
-
def self.run(app
|
62
|
-
new(app
|
60
|
+
def self.run(app,**options)
|
61
|
+
new(app,**options).run
|
63
62
|
end
|
64
63
|
|
65
64
|
#
|
@@ -67,9 +66,9 @@ module Rack
|
|
67
66
|
#
|
68
67
|
def run
|
69
68
|
@server = Net::HTTP::Server::Daemon.new(
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
69
|
+
host: @options[:Host],
|
70
|
+
port: @options[:Port],
|
71
|
+
handler: self
|
73
72
|
)
|
74
73
|
|
75
74
|
@server.start
|
@@ -89,9 +88,9 @@ module Rack
|
|
89
88
|
# The response status, headers and body.
|
90
89
|
#
|
91
90
|
def call(request,stream)
|
92
|
-
request_uri
|
91
|
+
request_uri = request[:uri]
|
93
92
|
remote_address = stream.socket.remote_address
|
94
|
-
local_address
|
93
|
+
local_address = stream.socket.local_address
|
95
94
|
|
96
95
|
env = {}
|
97
96
|
|
@@ -105,21 +104,21 @@ module Rack
|
|
105
104
|
env['rack.url_scheme'] = request_uri[:scheme].to_s
|
106
105
|
end
|
107
106
|
|
108
|
-
env['SERVER_NAME']
|
109
|
-
env['SERVER_PORT']
|
107
|
+
env['SERVER_NAME'] = local_address.getnameinfo[0]
|
108
|
+
env['SERVER_PORT'] = local_address.ip_port.to_s
|
110
109
|
env['SERVER_PROTOCOL'] = "HTTP/#{request[:http_version]}"
|
111
110
|
|
112
111
|
env['REMOTE_ADDR'] = remote_address.ip_address
|
113
112
|
env['REMOTE_PORT'] = remote_address.ip_port.to_s
|
114
113
|
|
115
114
|
env['REQUEST_METHOD'] = request[:method].to_s
|
116
|
-
env['PATH_INFO']
|
117
|
-
env['QUERY_STRING']
|
115
|
+
env['PATH_INFO'] = request_uri.fetch(:path,'*').to_s
|
116
|
+
env['QUERY_STRING'] = request_uri[:query].to_s
|
118
117
|
|
119
118
|
# add the headers
|
120
119
|
request[:headers].each do |name,value|
|
121
120
|
key = name.dup
|
122
|
-
|
121
|
+
|
123
122
|
key.upcase!
|
124
123
|
key.tr!('-','_')
|
125
124
|
|