qeweney 0.9.1 → 0.13.1

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: e7607c9eba1cc73f966e3da34d266c40aa0dec6d9294da905b49f3b3efc628ff
4
- data.tar.gz: 16c15a7655cab3ed23437ed6f1f12d63df3676d63145cfb75a0505de1b8b5f3b
3
+ metadata.gz: 54e76d6fe9d2c6490b00db19756306242b78465041f25e5771bedd630b6ad542
4
+ data.tar.gz: 791acd0d69d9a3d95d62e207127829a3509986870ffcf94bd1690ebc37a76ea0
5
5
  SHA512:
6
- metadata.gz: 7ce90ffad9f012d33ebaf6a48100ad684151b1b62be47004fdc8d991e6e755755c15ce945a602d607d1124db962e7a49921e369d9c9dadb059c776ae7c94c175
7
- data.tar.gz: 0b950d98a942954ae7c824c3a475eaaeb9752a6d7a854fbebd383a02afde1d703ddf530538900d5f79ba61eddc1ab8220a0e2b9e95c488be225170d62d7de296
6
+ metadata.gz: 7717cd77a46b8c13f496dcbeadf34af9ee7b5ba9173f8d3c638b46dc1cbdaabbda20045d59bb4a33b843145baf426ecc484df3b5ab9f018e5c9566116d4d4232
7
+ data.tar.gz: e42853c551362e72fff6a51be7f236fd958a26e4415c6b924022ea711ac10058a56864051fc542f3eb0c926a0013af8fbb30451235bac949dadfd6bc4255d15e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## 0.13.1 2021-08-03
2
+
3
+ - Fix `Request#read`
4
+
5
+ ## 0.13 2021-08-02
6
+
7
+ - Restore `Request#complete?` method
8
+ - Add buffered_only argument to `Request#next_chunk`
9
+
10
+ ## 0.12 2021-07-30
11
+
12
+ - Remove `Request#consume` method
13
+ - Remove `Request#complete?` and associated methods
14
+
15
+ ## 0.11 2021-07-26
16
+
17
+ - Fix rack env (digital-fabric/tipi#11)
18
+
19
+ ## 0.10 2021-06-24
20
+
21
+ - Include file stat in `#serve_io` options as hint for adapter
22
+ - Fix `MimeTypes#[]` for empty extension
23
+
1
24
  ## 0.9.1 2021-06-14
2
25
 
3
26
  - Fix reading host from `:authority` header
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qeweney (0.9.1)
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,28 @@ 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
55
+ if @buffered_body_chunks
56
+ body = @buffered_body_chunks.join
57
+ if !complete?
58
+ rest = @adapter.get_body(self)
59
+ body << rest if rest
60
+ end
61
+ @buffered_body_chunks = nil
62
+ return body
73
63
  end
74
- @buffered_body_chunks = nil
75
- buf
64
+ @adapter.get_body(self)
76
65
  end
77
66
  alias_method :body, :read
67
+
68
+ def complete?
69
+ @adapter.complete?(self)
70
+ end
78
71
 
79
72
  def respond(body, headers = {})
80
73
  @adapter.respond(self, body, headers)
@@ -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.1'
4
+ VERSION = '0.13.1'
5
5
  end
@@ -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.1
4
+ version: 0.13.1
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-06-14 00:00:00.000000000 Z
11
+ date: 2021-08-03 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.1.6
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Qeweney - cross library HTTP request / response API