qeweney 0.9.0 → 0.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fbf7ec4eb0c73fef2003190fd086c46fff0edc74ab4544c5a36b7d6fcce4041
4
- data.tar.gz: 328254edf151b4ce1acc201438b315eb6569c96868b84b9160a2ed0ff0636870
3
+ metadata.gz: 742be1b1238ea117928a544134e57702776b707caf0cccdf68b74225ff3990d7
4
+ data.tar.gz: 357beb13e5f99b3f776de0a9e30447a034a647af208c1d69adedc118cabe8be1
5
5
  SHA512:
6
- metadata.gz: 31ba2523f8ef5dd0155eaba082967b1a2ee97bea5f40b319c3b3110e9cb549032909a95c9a5147161ed2613a9c3f8688d81496286684876c614f0b185629232b
7
- data.tar.gz: 2d2b4a3b7a30b6a6ec5fa83c95e2b19a37bad50ab195af011ca52f504f597069d4d3ef0a60e6553a99132baac506fe6e0be570532392557be207923125f47577
6
+ metadata.gz: 2b0249f07ce24a2acb3d9d20a9a43927de50217b9b27d23b911819c50ad6ca6312c395c966ebd57fda8db69908de392667ed3294ced76d4143b1ecbc37820cef
7
+ data.tar.gz: c80e535de1921e6b655a019c74a1a35fc808a9a7088ef368b84a485b42582d37d03ac9eb53250fd73277fe077cdd6c28ae6a4f60b814931fd6150f22ab929a42
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## 0.13 2021-08-02
2
+
3
+ - Restore `Request#complete?` method
4
+ - Add buffered_only argument to `Request#next_chunk`
5
+
6
+ ## 0.12 2021-07-30
7
+
8
+ - Remove `Request#consume` method
9
+ - Remove `Request#complete?` and associated methods
10
+
11
+ ## 0.11 2021-07-26
12
+
13
+ - Fix rack env (digital-fabric/tipi#11)
14
+
15
+ ## 0.10 2021-06-24
16
+
17
+ - Include file stat in `#serve_io` options as hint for adapter
18
+ - Fix `MimeTypes#[]` for empty extension
19
+
20
+ ## 0.9.1 2021-06-14
21
+
22
+ - Fix reading host from `:authority` header
23
+
1
24
  ## 0.9.0 2021-05-14
2
25
 
3
26
  - Fix query parsing for fields with empty value
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qeweney (0.9.0)
4
+ qeweney (0.13)
5
5
  escape_utils (~> 1.2.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,4 +1,8 @@
1
- # Qeweney
1
+ # Qeweney - add water, makes its own sauce!
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/qeweney.svg)](http://rubygems.org/gems/qeweney)
4
+ [![Modulation Test](https://github.com/digital-fabric/qeweney/workflows/Tests/badge.svg)](https://github.com/digital-fabric/qeweney/actions?query=workflow%3ATests)
5
+ [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/digital-fabric/qeweney/blob/master/LICENSE)
2
6
 
3
7
  ## Cross-library HTTP request / response API for servers
4
8
 
@@ -19,12 +19,16 @@ module Qeweney
19
19
  'json' => 'application/json',
20
20
  }.freeze
21
21
 
22
+ EXT_REGEXP = /\.?([^\.]+)$/.freeze
23
+
22
24
  def self.[](ref)
23
25
  case ref
24
26
  when Symbol
25
27
  TYPES[ref.to_s]
26
- when /\.?([^\.]+)$/
28
+ when EXT_REGEXP
27
29
  TYPES[Regexp.last_match(1)]
30
+ when ''
31
+ nil
28
32
  else
29
33
  raise "Invalid argument #{ref.inspect}"
30
34
  end
data/lib/qeweney/rack.rb CHANGED
@@ -67,12 +67,33 @@ module Qeweney
67
67
  end
68
68
  end
69
69
 
70
+ # TODO: integrate in env
71
+ # Implements a rack input stream:
72
+ # https://www.rubydoc.info/github/rack/rack/master/file/SPEC#label-The+Input+Stream
73
+ class InputStream
74
+ def initialize(request)
75
+ @request = request
76
+ end
77
+
78
+ def gets; end
79
+
80
+ def read(length = nil, outbuf = nil); end
81
+
82
+ def each(&block)
83
+ @request.each_chunk(&block)
84
+ end
85
+
86
+ def rewind; end
87
+ end
88
+
70
89
  def self.rack_env_from_request(request)
71
90
  Hash.new do |h, k|
72
- h[k] = env_value_from_request(request, k)
91
+ h[k] = rack_env_value_from_request(request, k)
73
92
  end
74
93
  end
75
94
 
95
+ # TODO: improve conformance to rack spec
96
+ # TODO: set values like port, scheme etc from actual connection
76
97
  RACK_ENV = {
77
98
  'SCRIPT_NAME' => '',
78
99
  'rack.version' => [1, 3],
@@ -90,9 +111,11 @@ module Qeweney
90
111
  'rack.multipar.tempfile_factory' => nil
91
112
  }
92
113
 
93
- def self.env_value_from_request(request, key)
114
+ HTTP_HEADER_RE = /^HTTP_(.+)$/.freeze
115
+
116
+ def self.rack_env_value_from_request(request, key)
94
117
  case key
95
- when 'REQUEST_METHOD' then request.method
118
+ when 'REQUEST_METHOD' then request.method.upcase
96
119
  when 'PATH_INFO' then request.path
97
120
  when 'QUERY_STRING' then request.query_string || ''
98
121
  when 'SERVER_NAME' then request.headers['host']
@@ -27,14 +27,16 @@ module Qeweney
27
27
  @buffered_body_chunks << chunk
28
28
  end
29
29
 
30
- def next_chunk
30
+ def next_chunk(buffered_only = false)
31
31
  if @buffered_body_chunks
32
32
  chunk = @buffered_body_chunks.shift
33
33
  @buffered_body_chunks = nil if @buffered_body_chunks.empty?
34
34
  return chunk
35
+ elsif buffered_only
36
+ return nil
35
37
  end
36
38
 
37
- @message_complete ? nil : @adapter.get_body_chunk(self)
39
+ @adapter.get_body_chunk(self, buffered_only)
38
40
  end
39
41
 
40
42
  def each_chunk
@@ -44,37 +46,19 @@ module Qeweney
44
46
  end
45
47
  @buffered_body_chunks = nil
46
48
  end
47
- while !@message_complete && (chunk = @adapter.get_body_chunk(self))
49
+ while (chunk = @adapter.get_body_chunk(self))
48
50
  yield chunk
49
51
  end
50
52
  end
51
53
 
52
- def complete!(keep_alive = nil)
53
- @message_complete = true
54
- @keep_alive = keep_alive
55
- end
56
-
57
- def complete?
58
- @message_complete
59
- end
60
-
61
- def consume
62
- @adapter.consume_request(self)
63
- end
64
-
65
- def keep_alive?
66
- @keep_alive
67
- end
68
-
69
54
  def read
70
- buf = @buffered_body_chunks ? @buffered_body_chunks.join : nil
71
- while (chunk = @adapter.get_body_chunk(self))
72
- (buf ||= +'') << chunk
73
- end
74
- @buffered_body_chunks = nil
75
- buf
55
+ @adapter.get_body(self)
76
56
  end
77
57
  alias_method :body, :read
58
+
59
+ def complete?
60
+ @adapter.complete?(self)
61
+ end
78
62
 
79
63
  def respond(body, headers = {})
80
64
  @adapter.respond(self, body, headers)
@@ -6,8 +6,9 @@ require 'escape_utils'
6
6
  module Qeweney
7
7
  module RequestInfoMethods
8
8
  def host
9
- @headers['host']
9
+ @headers['host'] || @headers[':authority']
10
10
  end
11
+ alias_method :authority, :host
11
12
 
12
13
  def connection
13
14
  @headers['connection']
@@ -74,6 +74,7 @@ module Qeweney
74
74
  end
75
75
 
76
76
  mime_type = Qeweney::MimeTypes[File.extname(path)]
77
+ opts[:stat] = stat
77
78
  (opts[:headers] ||= {})['Content-Type'] ||= mime_type if mime_type
78
79
 
79
80
  respond_with_static_file(full_path, etag, last_modified, opts)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qeweney
4
- VERSION = '0.9.0'
4
+ VERSION = '0.13'
5
5
  end
@@ -29,9 +29,15 @@ class RequestInfoTest < MiniTest::Test
29
29
  def test_host
30
30
  r = Qeweney.mock(':path' => '/')
31
31
  assert_nil r.host
32
+ assert_nil r.authority
32
33
 
33
34
  r = Qeweney.mock('host' => 'my.example.com')
34
35
  assert_equal 'my.example.com', r.host
36
+ assert_equal 'my.example.com', r.authority
37
+
38
+ r = Qeweney.mock(':authority' => 'my.foo.com')
39
+ assert_equal 'my.foo.com', r.host
40
+ assert_equal 'my.foo.com', r.authority
35
41
  end
36
42
 
37
43
  def test_full_uri
@@ -179,7 +179,7 @@ class ServeRackTest < MiniTest::Test
179
179
  })
180
180
 
181
181
  assert_equal [
182
- [:respond, r, 'get /foo/bar', {':status' => 404, 'Foo' => 'Bar' }]
182
+ [:respond, r, 'GET /foo/bar', {':status' => 404, 'Foo' => 'Bar' }]
183
183
  ], r.response_calls
184
184
  end
185
185
  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.9.0
4
+ version: '0.13'
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-05-14 00:00:00.000000000 Z
11
+ date: 2021-08-02 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.0.8
139
+ rubygems_version: 3.1.6
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Qeweney - cross library HTTP request / response API