qeweney 0.7 → 0.7.5

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: 57bbb94d61917bad178ee53693fdecc3f3aa878495c3d53d04d263bd34934792
4
- data.tar.gz: 5075929ee6a35dc1c1420b6a312ff5c861e6e2b7267993eacb3b55ec09d6f6c6
3
+ metadata.gz: c4a3ab1651dedfc78d9d35aa048db2d77e3eb8873d2cbd81d2944746b07ecee8
4
+ data.tar.gz: f75a0a000b4c1f690885deb9b163baf9ead6d285ab2c58366821c26e995342d4
5
5
  SHA512:
6
- metadata.gz: '096b6148118776622ba648d9bb4dc8808575b35beecc90b2893518d83edc402a0d257a79db04d698a656f937249d130b56e0e0eeff4df7475b413a98d9012374'
7
- data.tar.gz: 6b9fe12bd28d762e1116313bf9dfb6f4e4804d75dd02edbf887449bb24100e098e178121401b4061f892d47c1dfee1dc5adc8b4f22376a6c8b08c96f4b3a0302
6
+ metadata.gz: e6aa575224a992f928fd42bec42979798e6656841eb676ca43996776ede7e24b303982a69376f735be0a5ec2ce02ced79b573a10353cd5b5d7097e168f4ce625
7
+ data.tar.gz: 3870128bb83a47be1fee088bd128e8701098b92f301cc515e863da462001ea65af51018ab3e1ae0e9c2dfd7250fad310690917d47fa2afa8b3fd88c5b2cbb381
data/CHANGELOG.md CHANGED
@@ -1,4 +1,17 @@
1
- ## 0.7 20921-03-04
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qeweney (0.7)
4
+ qeweney (0.7.5)
5
5
  escape_utils (~> 1.2.1)
6
6
 
7
7
  GEM
@@ -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]
@@ -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
 
@@ -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
- opts = opts.merge(headers: {
83
- 'etag' => etag,
84
- 'last-modified' => last_modified,
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|
@@ -26,7 +26,7 @@ module Qeweney
26
26
  end
27
27
 
28
28
  def route_relative_path
29
- @path_parts[@path_parts_idx..-1].join('/')
29
+ @path_parts.empty? ? '/' : "/#{@path_parts[@path_parts_idx..-1].join('/')}"
30
30
  end
31
31
 
32
32
  def enter_route
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qeweney
4
- VERSION = '0.7'
4
+ VERSION = '0.7.5'
5
5
  end
@@ -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
- r.on_root { r.respond('root') }
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: '0.7'
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-04 00:00:00.000000000 Z
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.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