tp2 0.9 → 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: 0fa7578335fe3be94277b5e3ddbb4417e72dd911a73cbc914607177b1b58107f
4
- data.tar.gz: e07b7f54b2056418051529db6a6f0e6dffddbbd87266f33cf15806fddb48485d
3
+ metadata.gz: b97ec9f81c0bb5aa55cc42ec96cc349f21c0bb88ebfe907300f58841e8bdcf4a
4
+ data.tar.gz: 48c9d21e5d2d4a7fe3d360dde8623deac46c0ddf0efccf94a1543c06e4bf7770
5
5
  SHA512:
6
- metadata.gz: 54b5a8c620e014a83d2955a19de91ea6945ea6c456ec8040367778c44f33f99da6d079d00737cd68201a82461655f5dbd9c35ab34ee8da3a349fc8624d3fd4f1
7
- data.tar.gz: 0ca8cb386203f8c91fe7c5d62a0fe79f332863f5c97145f65459c12650033dc1bbf4781c988070868ad760a7844350f45ba645ec8ad2891e03e73b0b485504d5
6
+ metadata.gz: 9fb4edb4db18989e6a218e15ed81543cf671ca5c925da3e134673fd93832b34c6345c5782b836b8e7f672492a53f73c0c0f83c832c4639beb00da5936f95dcee
7
+ data.tar.gz: 4cd296f4c7dd5ae7b72367a1f829589eaab29a3d0bacfff9c973cdfe82f78894c6da96819528421672537f6a308da4e3258290b4afb20b9631b7348a9dbb2379
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # Version 0.10 2025-06-10
2
+
3
+ - Fix static file serving
4
+ - Fix silent mode
5
+
1
6
  # Version 0.9 2025-06-09
2
7
 
3
8
  - Use `#close_async` for closing sockets
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
@@ -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/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module TP2
2
- VERSION = '0.9'
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
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.9'
4
+ version: '0.10'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner