qeweney 0.9.1 → 0.13.1

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: 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