qeweney 0.6 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc2a56f6f21001d4122d990b735f952521f2949b6d76811bc2f5e528f60ca8ed
4
- data.tar.gz: e7f1a6fa8e788ef4bf1612ac043f847497f3c4b9558a8959ad75182806106088
3
+ metadata.gz: a7beaa70b4d37af5b9bb46aa06bcd78e6d9353eada5715e28d22bc8b5fac61a4
4
+ data.tar.gz: 030c6f1fb05fde6ae12c2bb61844c98b9e821b4f7e21f1e7d51fa934814bc3b1
5
5
  SHA512:
6
- metadata.gz: 4be0bb1c58d67ccaa8550b6b1ce59dfbc5cdb6a87d19ede17702293eb521bec416d9932b54627eb43ba832c55dee4e4320983d6eb14fdae4131d751eb459391a
7
- data.tar.gz: 5cf454ddf41665c9abf6cdba864161257c2d11da5c60add1926cc27e9ba5fcef3a3eeba003815e4cbd8095d70632ed999390cfd07912a135cb33813155876762
6
+ metadata.gz: 82b3104f93f3ac826f2c4319fb4c9c324efbb490983af4b8035f402fcb04c13f8f8f28dd2443764dcff26e9d7e33f0eb071c3ec0005acefd4fe27cbd13d314e4
7
+ data.tar.gz: 9629ed95b4b7397fc8c15ef1b10b8948d31fc047e913c5aab9b7450eaa4ff31cbf7dde4b027870757eb02c0d72e00d8f766c57871aca9fc6948a75ed90adb769
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.7.4 2021-03-07
2
+
3
+ - Add `Request#cookies`
4
+ - Add `Request#full_uri`
5
+
6
+ ## 0.7.3 2021-03-05
7
+
8
+ - Fix `parse_urlencoded_form_data`
9
+
10
+ ## 0.7.2 2021-03-04
11
+
12
+ - Add `#route_relative_path` method
13
+
1
14
  ## 0.6 2021-03-03
2
15
 
3
16
  - More work on routing (still WIP)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qeweney (0.6)
4
+ qeweney (0.7.4)
5
5
  escape_utils (~> 1.2.1)
6
6
 
7
7
  GEM
data/TODO.md CHANGED
@@ -58,7 +58,7 @@ PAGES = Tipi::PageManager(
58
58
 
59
59
  app = Tipi.app do |r|
60
60
  r.on 'static' do
61
- r.serve_file(r.routing_path, base_path: ASSETS_PATH)
61
+ r.serve_file(r.route_path, base_path: ASSETS_PATH)
62
62
  end
63
63
 
64
64
  r.default do
@@ -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,22 @@ 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
+ cookies.split(SEMICOLON).each_with_object({}) do |c, h|
91
+ raise BadRequestError, 'Invalid cookie format' unless c.strip =~ COOKIE_RE
92
+
93
+ key, value = Regexp.last_match[1..2]
94
+ h[key] = EscapeUtils.unescape_uri(value)
95
+ end
96
+ end
77
97
  end
78
98
 
79
99
  module RequestInfoClassMethods
@@ -138,7 +158,7 @@ module Qeweney
138
158
  MAX_PARAMETER_VALUE_SIZE = 2**20 # 1MB
139
159
 
140
160
  def parse_urlencoded_form_data(body)
141
- body.force_encoding(UTF_8) unless body.encoding == Encoding::UTF_8
161
+ body.force_encoding(Encoding::UTF_8) unless body.encoding == Encoding::UTF_8
142
162
  body.split('&').each_with_object({}) do |i, m|
143
163
  raise 'Invalid parameter format' unless i =~ PARAMETER_RE
144
164
 
@@ -25,6 +25,10 @@ module Qeweney
25
25
  @path_parts[@path_parts_idx]
26
26
  end
27
27
 
28
+ def route_relative_path
29
+ @path_parts.empty? ? '/' : "/#{@path_parts[@path_parts_idx..-1].join('/')}"
30
+ end
31
+
28
32
  def enter_route
29
33
  @path_parts_idx += 1
30
34
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qeweney
4
- VERSION = '0.6'
4
+ VERSION = '0.7.4'
5
5
  end
@@ -20,4 +20,26 @@ 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
+ 'cookie' => 'uaid=a%2Fb; lastLocus=settings; signin_ref=/'
37
+ )
38
+
39
+ assert_equal({
40
+ 'uaid' => 'a/b',
41
+ 'lastLocus' => 'settings',
42
+ 'signin_ref' => '/'
43
+ }, r.cookies)
44
+ end
23
45
  end
data/test/test_routing.rb CHANGED
@@ -72,4 +72,45 @@ class RoutingTest < MiniTest::Test
72
72
  app.(r)
73
73
  assert_equal [[:respond, 'baz root', {}]], r.response_calls
74
74
  end
75
+
76
+ def test_relative_path
77
+ default_relative_path = nil
78
+
79
+ app = Qeweney.route do |r|
80
+ default_relative_path = r.route_relative_path
81
+ r.on_root { r.respond(File.join('ROOT', r.route_relative_path)) }
82
+ r.on('foo') { r.respond(File.join('FOO', r.route_relative_path)) }
83
+ r.on('bar') {
84
+ r.on('baz') { r.respond(File.join('BAR/BAZ', r.route_relative_path)) }
85
+ r.default { r.respond(File.join('BAR', r.route_relative_path)) }
86
+ }
87
+ r.on('baz') { r.respond(r.route_relative_path) }
88
+ end
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
+
96
+ r = Qeweney.mock(':path' => '/foo/bar/baz')
97
+ app.(r)
98
+ assert_equal '/foo/bar/baz', default_relative_path
99
+ assert_equal [[:respond, 'FOO/bar/baz', {}]], r.response_calls
100
+
101
+ r = Qeweney.mock(':path' => '/bar/a/b/c')
102
+ app.(r)
103
+ assert_equal '/bar/a/b/c', default_relative_path
104
+ assert_equal [[:respond, 'BAR/a/b/c', {}]], r.response_calls
105
+
106
+ r = Qeweney.mock(':path' => '/bar/baz/b/c')
107
+ app.(r)
108
+ assert_equal '/bar/baz/b/c', default_relative_path
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
115
+ end
75
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: '0.6'
4
+ version: 0.7.4
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-03 00:00:00.000000000 Z
11
+ date: 2021-03-07 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.1.4
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