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