tp2 0.8.3 → 0.10

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: 991ec5937591a3e57675d686d11670b682e7c5644391b4f301b091befcbae17f
4
- data.tar.gz: 7413f8027c235ff4377077d7391b58c7540cf1257d05c3d9c6b837705c1c1329
3
+ metadata.gz: b97ec9f81c0bb5aa55cc42ec96cc349f21c0bb88ebfe907300f58841e8bdcf4a
4
+ data.tar.gz: 48c9d21e5d2d4a7fe3d360dde8623deac46c0ddf0efccf94a1543c06e4bf7770
5
5
  SHA512:
6
- metadata.gz: fead1d1fdfad4ad3a66e757ed9613af4651fe25fe112cfede015d7c410f4655e52f51eaaa7b7530aea84d49201566088e88305464cd823a8dd9583b7bf21297d
7
- data.tar.gz: 01cfb68c33c5a7b2a652e7d01d87798be696dc3bcbc0a62dbc1b9c134e709170cc9fc35d9ca4873518bb308eccf0f0973720238814f167e52f34a203cfff03d8
6
+ metadata.gz: 9fb4edb4db18989e6a218e15ed81543cf671ca5c925da3e134673fd93832b34c6345c5782b836b8e7f672492a53f73c0c0f83c832c4639beb00da5936f95dcee
7
+ data.tar.gz: 4cd296f4c7dd5ae7b72367a1f829589eaab29a3d0bacfff9c973cdfe82f78894c6da96819528421672537f6a308da4e3258290b4afb20b9631b7348a9dbb2379
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # Version 0.10 2025-06-10
2
+
3
+ - Fix static file serving
4
+ - Fix silent mode
5
+
6
+ # Version 0.9 2025-06-09
7
+
8
+ - Use `#close_async` for closing sockets
9
+ - Update UringMachine
10
+
1
11
  # Version 0.8.3 2025-06-09
2
12
 
3
13
  - Improve error handling
data/bin/tp2 CHANGED
@@ -31,8 +31,8 @@ parser = OptionParser.new do |o|
31
31
  }
32
32
 
33
33
  o.on("-s", "--silent", "Silent mode") {
34
- opts[:banner] = false
35
- opts[:log] = false
34
+ opts[:banner] = nil
35
+ opts[:log] = nil
36
36
  }
37
37
 
38
38
  o.on("-h", "--help", "Show this help message") do
@@ -39,7 +39,7 @@ module TP2
39
39
  raise
40
40
  end
41
41
  ensure
42
- @machine.close(@fd)
42
+ @machine.close_async(@fd)
43
43
  end
44
44
 
45
45
  def serve_request
@@ -164,6 +164,42 @@ module TP2
164
164
  end
165
165
  end
166
166
 
167
+ def respond_with_static_file(req, path, opts, cache_headers)
168
+ fd = @machine.open(path, UM::O_RDONLY)
169
+ opts ||= {}
170
+ if opts[:headers]
171
+ opts[:headers].merge!(cache_headers)
172
+ else
173
+ opts[:headers] = cache_headers
174
+ end
175
+
176
+ maxlen = opts[:max_len] || 65536
177
+ buf = String.new(capacity: maxlen)
178
+ headers_sent = nil
179
+ while true
180
+ res = @machine.read(fd, buf, maxlen, 0)
181
+ if res < maxlen && !headers_sent
182
+ return respond(req, buf, opts[:headers])
183
+ elsif res == 0
184
+ return finish(req)
185
+ end
186
+
187
+ if !headers_sent
188
+ send_headers(req, opts[:headers])
189
+ headers_sent = true
190
+ end
191
+ done = res < maxlen
192
+ send_chunk(req, buf, done: done)
193
+ return if done
194
+ end
195
+ ensure
196
+ @machine.close(fd) if fd
197
+ end
198
+
199
+ def close
200
+ @machine.close_async(@fd)
201
+ end
202
+
167
203
  private
168
204
 
169
205
  def log(request, response_headers)
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Qeweney::Request
4
- def serve_io(io, opts)
5
- # TODO: implement using UM
4
+ def respond_with_static_file(path, etag, last_modified, opts)
5
+ cache_headers = (etag || last_modified) ? {
6
+ 'etag' => etag,
7
+ 'last-modified' => last_modified,
8
+ } : {}
6
9
 
7
- raise NotImplementedError
10
+ adapter.respond_with_static_file(self, path, opts, cache_headers)
8
11
  end
9
12
  end
data/lib/tp2/server.rb CHANGED
@@ -119,7 +119,7 @@ module TP2
119
119
  end
120
120
 
121
121
  def close_all_server_fds
122
- @server_fds.each { @machine.close(it) }
122
+ @server_fds.each { @machine.close_async(it) }
123
123
  end
124
124
 
125
125
  def graceful_shutdown
@@ -145,8 +145,6 @@ module TP2
145
145
  rescue UM::Terminate
146
146
  # timeout on waiting for adapters to finish running, do nothing
147
147
  end
148
- ensure
149
- @machine.close(@server_fd) rescue nil
150
148
  end
151
149
  end
152
150
  end
data/lib/tp2/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module TP2
2
- VERSION = '0.8.3'
2
+ VERSION = '0.10'
3
3
  end
@@ -520,4 +520,57 @@ class HTTP1AdapterTest < Minitest::Test
520
520
  assert_equal expected, response
521
521
  assert count >= chunk_count
522
522
  end
523
+
524
+ def test_static_file_serving
525
+ fn = "/tmp/tp2-#{rand(1000)}"
526
+ IO.write(fn, 'foobar')
527
+
528
+ @hook = ->(req) do
529
+ req.respond_with_static_file(fn, nil, nil, nil)
530
+ req.adapter.close
531
+ end
532
+
533
+ response = +''
534
+ count = 0
535
+
536
+ write_client_side("GET / HTTP/1.1\r\n\r\n")
537
+ @machine.spin { @adapter.serve_request }
538
+
539
+ while (data = read_client_side(65536))
540
+ response << data
541
+ count += 1
542
+ @machine.snooze
543
+ end
544
+
545
+ content = IO.read(__FILE__)
546
+ file_size = content.bytesize
547
+ expected = "HTTP/1.1 200\r\nContent-Length: 6\r\n\r\nfoobar"
548
+
549
+ assert_equal expected, response
550
+ end
551
+
552
+ def test_static_file_serving_big
553
+ fn = "/tmp/tp2-#{rand(1000)}"
554
+ IO.write(fn, 'foobar')
555
+
556
+ @hook = ->(req) do
557
+ req.respond_with_static_file(fn, nil, nil, { max_len: 3 })
558
+ req.adapter.close
559
+ end
560
+
561
+ response = +''
562
+ count = 0
563
+
564
+ write_client_side("GET / HTTP/1.1\r\n\r\n")
565
+ @machine.spin { @adapter.serve_request }
566
+
567
+ while (data = read_client_side(65536))
568
+ response << data
569
+ count += 1
570
+ @machine.snooze
571
+ end
572
+
573
+ expected = "HTTP/1.1 200\r\nTransfer-Encoding: chunked\r\n\r\n3\r\nfoo\r\n3\r\nbar\r\n0\r\n\r\n"
574
+ assert_equal expected, response
575
+ end
523
576
  end
data/tp2.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.required_ruby_version = '>= 3.4'
21
21
  s.executables = ['tp2']
22
22
 
23
- s.add_dependency 'uringmachine', '>=0.13'
23
+ s.add_dependency 'uringmachine', '>=0.14'
24
24
  s.add_dependency 'qeweney', '0.21'
25
25
  s.add_dependency 'rack', '3.1.15'
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tp2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: '0.10'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '0.13'
18
+ version: '0.14'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '0.13'
25
+ version: '0.14'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: qeweney
28
28
  requirement: !ruby/object:Gem::Requirement