ruby_wolf 0.3.3 → 0.4.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 +4 -4
- data/lib/ruby_wolf/handler.rb +45 -40
- data/lib/ruby_wolf/logger.rb +13 -5
- data/lib/ruby_wolf/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03a1ec8b4a81dec0caa042067573f74ea59b294d
|
4
|
+
data.tar.gz: bfb6eded8e2f5e1a36b1f38ef6cd19f4a5aafbba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f532b43a8b05fe7b53468f2a81cfceb97fda03f05e16b18e2abf14c3d9b38b3fb26fb77f6791cea9ac0410f3403d980d7cf9cbd2a58a96b96e563b00c6bb328
|
7
|
+
data.tar.gz: 8f8c7aec4adb099866f76e89592bf97b35a47143b69bc3e7b9aa6f80d1569e848f8842970dd73234142a3d5ceaa5e192de785732a9069f414948661bb654b0bd
|
data/lib/ruby_wolf/handler.rb
CHANGED
@@ -2,28 +2,36 @@ require 'http/parser'
|
|
2
2
|
|
3
3
|
module RubyWolf
|
4
4
|
class Handler
|
5
|
-
|
6
|
-
attr_reader :app, :env, :connection, :response, :callback, :body, :headers, :status
|
5
|
+
attr_reader :app, :env, :connection, :response
|
7
6
|
|
8
7
|
def initialize(app, connection, &callback)
|
9
8
|
@app = app
|
10
|
-
@connection = connection
|
11
|
-
@callback = callback
|
12
9
|
@env = {}
|
10
|
+
@connection = connection
|
13
11
|
@response = ''
|
12
|
+
|
13
|
+
@callback = callback
|
14
14
|
end
|
15
15
|
|
16
16
|
def process
|
17
17
|
prepare_rack_env
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
log_request
|
19
|
+
process_request
|
20
|
+
compose_response
|
21
|
+
log_response
|
22
|
+
|
23
|
+
@callback.call(response) if @callback
|
24
|
+
@response
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
24
28
|
|
25
29
|
def prepare_rack_env
|
26
|
-
@
|
30
|
+
@connection.headers.each do |key, value|
|
31
|
+
@env[rack_key(key)] = value
|
32
|
+
end
|
33
|
+
|
34
|
+
@env = @env.merge(
|
27
35
|
'rack.version' => ::Rack::VERSION,
|
28
36
|
'rack.errors' => STDERR,
|
29
37
|
'rack.multithread' => false,
|
@@ -31,69 +39,66 @@ module RubyWolf
|
|
31
39
|
'rack.runonce' => true,
|
32
40
|
'rack.url_scheme' => ENV['HTTPS'] ? 'https' : 'http',
|
33
41
|
|
34
|
-
'REQUEST_METHOD' => connection.method,
|
35
|
-
'REQUEST_PATH' => connection.path,
|
36
|
-
'PATH_INFO' => connection.path,
|
37
|
-
'QUERY_STRING' => connection.query,
|
42
|
+
'REQUEST_METHOD' => @connection.method,
|
43
|
+
'REQUEST_PATH' => @connection.path,
|
44
|
+
'PATH_INFO' => @connection.path,
|
45
|
+
'QUERY_STRING' => @connection.query,
|
38
46
|
|
39
47
|
'SERVER_PROTOCOL' => 'HTTP/1.1',
|
40
48
|
'SERVER_NAME' => 'Ruby Wolf',
|
41
49
|
'HTTP_VERSION' => 'HTTP/1.1',
|
42
|
-
'HTTP_HOST' => connection.headers['Host'],
|
43
|
-
'HTTP_USER_AGENT' => connection.headers['User-Agent'],
|
44
|
-
'HTTP_ACCEPT' => connection.headers['Accept'],
|
45
|
-
'CONTENT_LENGTH' => connection.headers['Content-Length'],
|
46
|
-
'CONTENT_TYPE' => connection.headers['Content-Type'],
|
47
50
|
|
48
|
-
'rack.input' => StringIO.new(connection.read_chunk)
|
51
|
+
'rack.input' => StringIO.new(@connection.read_chunk)
|
49
52
|
)
|
50
|
-
log_request
|
51
53
|
end
|
52
54
|
|
53
|
-
def
|
54
|
-
@status, @headers, @body = app.call(env)
|
55
|
-
|
56
|
-
|
55
|
+
def process_request
|
56
|
+
@status, @headers, @body = @app.call(env)
|
57
|
+
rescue => e
|
58
|
+
message = "Error while processing the request: #{e.message}\n#{e.backtrace.join("\n")}"
|
59
|
+
@status = 500
|
60
|
+
@body = [message]
|
61
|
+
@headers = [
|
62
|
+
['Content-Length', message.bytesize],
|
63
|
+
['Content-Type', 'text/plain; charset=utf-8']
|
64
|
+
]
|
65
|
+
RubyWolf.logger.error(message)
|
57
66
|
end
|
58
67
|
|
59
68
|
def compose_response
|
60
|
-
@response += "HTTP/1.1 #{status} #{RubyWolf::CRLF}"
|
61
|
-
headers.each do |key, value|
|
69
|
+
@response += "HTTP/1.1 #{@status} #{RubyWolf::CRLF}"
|
70
|
+
@headers.each do |key, value|
|
62
71
|
@response += "#{key}: #{value}#{RubyWolf::CRLF}"
|
63
72
|
end
|
64
73
|
|
65
74
|
@response += RubyWolf::CRLF
|
66
|
-
body.each do |part|
|
75
|
+
@body.each do |part|
|
67
76
|
@response += part
|
68
77
|
end
|
69
78
|
ensure
|
70
|
-
body.close if body.respond_to? :close
|
79
|
+
@body.close if @body.respond_to? :close
|
71
80
|
end
|
72
81
|
|
73
82
|
private
|
74
83
|
|
75
84
|
def log_request
|
76
|
-
RubyWolf.logger.info(
|
77
|
-
[
|
78
|
-
'HTTP/1.1',
|
79
|
-
connection.method,
|
80
|
-
request_path
|
81
|
-
].join(' ')
|
82
|
-
)
|
85
|
+
RubyWolf.logger.info("HTTP/1.1 #{@connection.method} #{request_path}")
|
83
86
|
end
|
84
87
|
|
85
88
|
def log_response
|
86
|
-
RubyWolf.logger.info(
|
87
|
-
"Response HTTP/1.1 #{status}"
|
88
|
-
)
|
89
|
+
RubyWolf.logger.info("Response HTTP/1.1 #{@status}")
|
89
90
|
end
|
90
91
|
|
91
92
|
def request_path
|
92
|
-
if connection.query
|
93
|
-
"#{connection.path}?#{connection.query}"
|
93
|
+
if @connection.query
|
94
|
+
"#{@connection.path}?#{@connection.query}"
|
94
95
|
else
|
95
|
-
connection.path
|
96
|
+
@connection.path
|
96
97
|
end
|
97
98
|
end
|
99
|
+
|
100
|
+
def rack_key(key)
|
101
|
+
"HTTP_#{key.upcase.gsub(/[^0-9A-Z]/, '_')}"
|
102
|
+
end
|
98
103
|
end
|
99
104
|
end
|
data/lib/ruby_wolf/logger.rb
CHANGED
@@ -2,31 +2,39 @@ require 'logger'
|
|
2
2
|
|
3
3
|
module RubyWolf
|
4
4
|
class Logger < ::Logger
|
5
|
-
def
|
5
|
+
def initialize(*args)
|
6
|
+
super(*args)
|
7
|
+
@formatter = proc do |severity, datetime, _progname, msg|
|
8
|
+
date_format = datetime.strftime('%Y-%m-%d %H:%M:%S')
|
9
|
+
"[#{severity.to_s[0]}] [#{date_format}] #{msg}\n"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def info(contents = '')
|
6
14
|
pre_process(contents) do |content|
|
7
15
|
super(content)
|
8
16
|
end
|
9
17
|
end
|
10
18
|
|
11
|
-
def warn(contents =
|
19
|
+
def warn(contents = '')
|
12
20
|
pre_process(contents) do |content|
|
13
21
|
super(content)
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
17
|
-
def debug(contents =
|
25
|
+
def debug(contents = '')
|
18
26
|
pre_process(contents) do |content|
|
19
27
|
super(content)
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
|
-
def error(contents =
|
31
|
+
def error(contents = '')
|
24
32
|
pre_process(contents) do |content|
|
25
33
|
super(content)
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
29
|
-
def fatal(contents =
|
37
|
+
def fatal(contents = '')
|
30
38
|
pre_process(contents) do |content|
|
31
39
|
super(content)
|
32
40
|
end
|
data/lib/ruby_wolf/version.rb
CHANGED