qeweney 0.7 → 0.7.5
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/CHANGELOG.md +14 -1
- data/Gemfile.lock +1 -1
- data/lib/qeweney/mime_types.rb +2 -2
- data/lib/qeweney/request_info.rb +23 -1
- data/lib/qeweney/response.rb +14 -5
- data/lib/qeweney/routing.rb +1 -1
- data/lib/qeweney/version.rb +1 -1
- data/test/test_request_info.rb +26 -0
- data/test/test_routing.rb +19 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4a3ab1651dedfc78d9d35aa048db2d77e3eb8873d2cbd81d2944746b07ecee8
|
4
|
+
data.tar.gz: f75a0a000b4c1f690885deb9b163baf9ead6d285ab2c58366821c26e995342d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6aa575224a992f928fd42bec42979798e6656841eb676ca43996776ede7e24b303982a69376f735be0a5ec2ce02ced79b573a10353cd5b5d7097e168f4ce625
|
7
|
+
data.tar.gz: 3870128bb83a47be1fee088bd128e8701098b92f301cc515e863da462001ea65af51018ab3e1ae0e9c2dfd7250fad310690917d47fa2afa8b3fd88c5b2cbb381
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,17 @@
|
|
1
|
-
## 0.7
|
1
|
+
## 0.7.5 2021-03-08
|
2
|
+
|
3
|
+
- Set content-type header in
|
4
|
+
|
5
|
+
## 0.7.4 2021-03-07
|
6
|
+
|
7
|
+
- Add `Request#cookies`
|
8
|
+
- Add `Request#full_uri`
|
9
|
+
|
10
|
+
## 0.7.3 2021-03-05
|
11
|
+
|
12
|
+
- Fix `parse_urlencoded_form_data`
|
13
|
+
|
14
|
+
## 0.7.2 2021-03-04
|
2
15
|
|
3
16
|
- Add `#route_relative_path` method
|
4
17
|
|
data/Gemfile.lock
CHANGED
data/lib/qeweney/mime_types.rb
CHANGED
@@ -7,7 +7,7 @@ module Qeweney
|
|
7
7
|
'html' => 'text/html',
|
8
8
|
'css' => 'text/css',
|
9
9
|
'js' => 'application/javascript',
|
10
|
-
'txt' => 'text/plain'
|
10
|
+
'txt' => 'text/plain',
|
11
11
|
|
12
12
|
'gif' => 'image/gif',
|
13
13
|
'jpg' => 'image/jpeg',
|
@@ -19,7 +19,7 @@ module Qeweney
|
|
19
19
|
'json' => 'application/json',
|
20
20
|
}.freeze
|
21
21
|
|
22
|
-
def [](ref)
|
22
|
+
def self.[](ref)
|
23
23
|
case ref
|
24
24
|
when Symbol
|
25
25
|
TYPES[ref.to_s]
|
data/lib/qeweney/request_info.rb
CHANGED
@@ -37,6 +37,10 @@ module Qeweney
|
|
37
37
|
@uri ||= URI.parse(@headers[':path'] || '')
|
38
38
|
end
|
39
39
|
|
40
|
+
def full_uri
|
41
|
+
@full_uri = "#{scheme}://#{host}#{uri}"
|
42
|
+
end
|
43
|
+
|
40
44
|
def path
|
41
45
|
@path ||= uri.path
|
42
46
|
end
|
@@ -74,6 +78,24 @@ module Qeweney
|
|
74
78
|
|
75
79
|
encoding.split(',').map { |i| i.strip }
|
76
80
|
end
|
81
|
+
|
82
|
+
def cookies
|
83
|
+
@cookies ||= parse_cookies(headers['cookie'])
|
84
|
+
end
|
85
|
+
|
86
|
+
COOKIE_RE = /^([^=]+)=(.*)$/.freeze
|
87
|
+
SEMICOLON = ';'
|
88
|
+
|
89
|
+
def parse_cookies(cookies)
|
90
|
+
return {} unless cookies
|
91
|
+
|
92
|
+
cookies.split(SEMICOLON).each_with_object({}) do |c, h|
|
93
|
+
raise BadRequestError, 'Invalid cookie format' unless c.strip =~ COOKIE_RE
|
94
|
+
|
95
|
+
key, value = Regexp.last_match[1..2]
|
96
|
+
h[key] = EscapeUtils.unescape_uri(value)
|
97
|
+
end
|
98
|
+
end
|
77
99
|
end
|
78
100
|
|
79
101
|
module RequestInfoClassMethods
|
@@ -138,7 +160,7 @@ module Qeweney
|
|
138
160
|
MAX_PARAMETER_VALUE_SIZE = 2**20 # 1MB
|
139
161
|
|
140
162
|
def parse_urlencoded_form_data(body)
|
141
|
-
body.force_encoding(UTF_8) unless body.encoding == Encoding::UTF_8
|
163
|
+
body.force_encoding(Encoding::UTF_8) unless body.encoding == Encoding::UTF_8
|
142
164
|
body.split('&').each_with_object({}) do |i, m|
|
143
165
|
raise 'Invalid parameter format' unless i =~ PARAMETER_RE
|
144
166
|
|
data/lib/qeweney/response.rb
CHANGED
@@ -6,6 +6,7 @@ require 'stringio'
|
|
6
6
|
require 'digest/sha1'
|
7
7
|
|
8
8
|
require_relative 'status'
|
9
|
+
require_relative 'mime_types'
|
9
10
|
|
10
11
|
module Qeweney
|
11
12
|
module StaticFileCaching
|
@@ -59,7 +60,7 @@ module Qeweney
|
|
59
60
|
redirect(secure_uri, status)
|
60
61
|
end
|
61
62
|
|
62
|
-
def serve_file(path, opts)
|
63
|
+
def serve_file(path, opts = {})
|
63
64
|
full_path = file_full_path(path, opts)
|
64
65
|
stat = File.stat(full_path)
|
65
66
|
etag = StaticFileCaching.file_stat_to_etag(stat)
|
@@ -72,17 +73,25 @@ module Qeweney
|
|
72
73
|
})
|
73
74
|
end
|
74
75
|
|
76
|
+
mime_type = Qeweney::MimeTypes[File.extname(path)]
|
77
|
+
(opts[:headers] ||= {})['Content-Type'] ||= mime_type if mime_type
|
78
|
+
|
75
79
|
respond_with_static_file(full_path, etag, last_modified, opts)
|
76
80
|
rescue Errno::ENOENT => e
|
77
81
|
respond(nil, ':status' => Status::NOT_FOUND)
|
78
82
|
end
|
79
83
|
|
80
84
|
def respond_with_static_file(path, etag, last_modified, opts)
|
85
|
+
cache_headers = {
|
86
|
+
'etag' => etag,
|
87
|
+
'last-modified' => last_modified,
|
88
|
+
}
|
81
89
|
File.open(path, 'r') do |f|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
90
|
+
if opts[:headers]
|
91
|
+
opts[:headers].merge!(cache_headers)
|
92
|
+
else
|
93
|
+
opts[:headers] = cache_headers
|
94
|
+
end
|
86
95
|
|
87
96
|
# accept_encoding should return encodings in client's order of preference
|
88
97
|
accept_encoding.each do |encoding|
|
data/lib/qeweney/routing.rb
CHANGED
data/lib/qeweney/version.rb
CHANGED
data/test/test_request_info.rb
CHANGED
@@ -20,4 +20,30 @@ class RequestInfoTest < MiniTest::Test
|
|
20
20
|
r = Qeweney.mock('host' => 'my.example.com')
|
21
21
|
assert_equal 'my.example.com', r.host
|
22
22
|
end
|
23
|
+
|
24
|
+
def test_full_uri
|
25
|
+
r = Qeweney.mock(
|
26
|
+
':scheme' => 'https',
|
27
|
+
'host' => 'foo.bar',
|
28
|
+
':path' => '/hey?a=b&c=d'
|
29
|
+
)
|
30
|
+
|
31
|
+
assert_equal 'https://foo.bar/hey?a=b&c=d', r.full_uri
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_cookies
|
35
|
+
r = Qeweney.mock
|
36
|
+
|
37
|
+
assert_equal({}, r.cookies)
|
38
|
+
|
39
|
+
r = Qeweney.mock(
|
40
|
+
'cookie' => 'uaid=a%2Fb; lastLocus=settings; signin_ref=/'
|
41
|
+
)
|
42
|
+
|
43
|
+
assert_equal({
|
44
|
+
'uaid' => 'a/b',
|
45
|
+
'lastLocus' => 'settings',
|
46
|
+
'signin_ref' => '/'
|
47
|
+
}, r.cookies)
|
48
|
+
end
|
23
49
|
end
|
data/test/test_routing.rb
CHANGED
@@ -74,25 +74,43 @@ class RoutingTest < MiniTest::Test
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def test_relative_path
|
77
|
+
default_relative_path = nil
|
78
|
+
|
77
79
|
app = Qeweney.route do |r|
|
78
|
-
|
80
|
+
default_relative_path = r.route_relative_path
|
81
|
+
r.on_root { r.respond(File.join('ROOT', r.route_relative_path)) }
|
79
82
|
r.on('foo') { r.respond(File.join('FOO', r.route_relative_path)) }
|
80
83
|
r.on('bar') {
|
81
84
|
r.on('baz') { r.respond(File.join('BAR/BAZ', r.route_relative_path)) }
|
82
85
|
r.default { r.respond(File.join('BAR', r.route_relative_path)) }
|
83
86
|
}
|
87
|
+
r.on('baz') { r.respond(r.route_relative_path) }
|
84
88
|
end
|
85
89
|
|
90
|
+
r = Qeweney.mock(':path' => '/')
|
91
|
+
app.(r)
|
92
|
+
assert_equal '/', default_relative_path
|
93
|
+
assert_equal [[:respond, 'ROOT/', {}]], r.response_calls
|
94
|
+
|
95
|
+
|
86
96
|
r = Qeweney.mock(':path' => '/foo/bar/baz')
|
87
97
|
app.(r)
|
98
|
+
assert_equal '/foo/bar/baz', default_relative_path
|
88
99
|
assert_equal [[:respond, 'FOO/bar/baz', {}]], r.response_calls
|
89
100
|
|
90
101
|
r = Qeweney.mock(':path' => '/bar/a/b/c')
|
91
102
|
app.(r)
|
103
|
+
assert_equal '/bar/a/b/c', default_relative_path
|
92
104
|
assert_equal [[:respond, 'BAR/a/b/c', {}]], r.response_calls
|
93
105
|
|
94
106
|
r = Qeweney.mock(':path' => '/bar/baz/b/c')
|
95
107
|
app.(r)
|
108
|
+
assert_equal '/bar/baz/b/c', default_relative_path
|
96
109
|
assert_equal [[:respond, 'BAR/BAZ/b/c', {}]], r.response_calls
|
110
|
+
|
111
|
+
r = Qeweney.mock(':path' => '/baz/d/e/f')
|
112
|
+
app.(r)
|
113
|
+
assert_equal '/baz/d/e/f', default_relative_path
|
114
|
+
assert_equal [[:respond, '/d/e/f', {}]], r.response_calls
|
97
115
|
end
|
98
116
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qeweney
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.7.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
136
|
- !ruby/object:Gem::Version
|
137
137
|
version: '0'
|
138
138
|
requirements: []
|
139
|
-
rubygems_version: 3.
|
139
|
+
rubygems_version: 3.0.8
|
140
140
|
signing_key:
|
141
141
|
specification_version: 4
|
142
142
|
summary: Qeweney - cross library HTTP request / response API
|