polyphony 0.62 → 0.63

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: 2cea172818871812ebbafcbee0a4b98d130a351f904d7732a02400ef363eac62
4
- data.tar.gz: f4ef85515436a463d3732f04bbef457426f267fac01f5c5c28619e42334cd745
3
+ metadata.gz: b2c69a05b391ebc688550a3894e56362de6603d04e807cad3072dfdffe966787
4
+ data.tar.gz: c09da8e0cb9e04eb4ea964e81cdd75a735f9e2f08f882ddaec8f2bee4be5661b
5
5
  SHA512:
6
- metadata.gz: 489b813f1bb2d7d97f87a60024b0665761571c4227e4fab6c733dcdb62b6ee98760473202c9154eb39a4b544663f759e4da6e70603d483e9f2ec2a64363cd4e1
7
- data.tar.gz: 05b232d7d67120e0983e60855c928beac6e91271fafc87586da7cc7543128fe326be04d126154ac7e0b0c0b249bf41ca90ab902f79f4a5fbf00cad498061f7e7
6
+ metadata.gz: cbd89d448e06cc80a105ab763b21b62054eb7ee4a21b8b115954765e80170d55a99b4a314695554493d81cbd73f87941846521a4b0dcac9d1653bcb8a51497f6
7
+ data.tar.gz: 6fc94352edc156fb963a4f74180208353ecd8cae82ffef1c6ac02b6413870ba028a5cea547dcdebb5bb3998b73a5529de209c035ae32ec7d4500678b3a7f7b65
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.63 2021-07-26
2
+
3
+ - Add support for specifying buf and buf_pos in `IO#read`
4
+ - Fix `Socket#read` to work and conform to `IO#read` interface
5
+
1
6
  ## 0.62 2021-07-21
2
7
 
3
8
  - Add `runqueue_size` to backend stats
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- polyphony (0.62)
4
+ polyphony (0.63)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/Rakefile CHANGED
@@ -9,8 +9,8 @@ Rake::ExtensionTask.new("polyphony_ext") do |ext|
9
9
  end
10
10
 
11
11
  task :recompile => [:clean, :compile]
12
-
13
12
  task :default => [:compile, :test]
13
+
14
14
  task :test do
15
15
  exec 'ruby test/run.rb'
16
16
  end
@@ -108,7 +108,11 @@ class ::IO
108
108
  end
109
109
 
110
110
  alias_method :orig_read, :read
111
- def read(len = nil)
111
+ def read(len = nil, buf = nil, buf_pos = 0)
112
+ if buf
113
+ return Polyphony.backend_read(self, buf, len, true, buf_pos)
114
+ end
115
+
112
116
  @read_buffer ||= +''
113
117
  result = Polyphony.backend_read(self, @read_buffer, len, true, -1)
114
118
  return nil unless result
@@ -64,6 +64,20 @@ class ::OpenSSL::SSL::SSLSocket
64
64
  # @sync = osync
65
65
  end
66
66
 
67
+ alias_method :orig_read, :read
68
+ def read(maxlen = nil, buf = nil, buf_pos = 0)
69
+ return readpartial(maxlen, buf, buf_pos) if buf
70
+
71
+ buf = +''
72
+ return readpartial(maxlen, buf) if maxlen
73
+
74
+ while true
75
+ readpartial(4096, buf, -1)
76
+ end
77
+ rescue EOFError
78
+ buf
79
+ end
80
+
67
81
  def readpartial(maxlen, buf = +'', buffer_pos = 0)
68
82
  if buffer_pos != 0
69
83
  if (result = sysread(maxlen, +''))
@@ -22,6 +22,23 @@ class ::Socket
22
22
  Polyphony.backend_connect(self, addr.ip_address, addr.ip_port)
23
23
  end
24
24
 
25
+ alias_method :orig_read, :read
26
+ def read(maxlen = nil, buf = nil, buf_pos = 0)
27
+ return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
28
+ return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
29
+
30
+ buf = +''
31
+ len = buf.bytesize
32
+ while true
33
+ Polyphony.backend_recv(self, buf, maxlen || 4096, -1)
34
+ new_len = buf.bytesize
35
+ break if new_len == len
36
+
37
+ len = new_len
38
+ end
39
+ buf
40
+ end
41
+
25
42
  def recv(maxlen, flags = 0, outbuf = nil)
26
43
  Polyphony.backend_recv(self, outbuf || +'', maxlen, 0)
27
44
  end
@@ -140,6 +157,23 @@ class ::TCPSocket
140
157
  setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEPORT, 1)
141
158
  end
142
159
 
160
+ alias_method :orig_read, :read
161
+ def read(maxlen = nil, buf = nil, buf_pos = 0)
162
+ return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
163
+ return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
164
+
165
+ buf = +''
166
+ len = buf.bytesize
167
+ while true
168
+ Polyphony.backend_recv(self, buf, maxlen || 4096, -1)
169
+ new_len = buf.bytesize
170
+ break if new_len == len
171
+
172
+ len = new_len
173
+ end
174
+ buf
175
+ end
176
+
143
177
  def recv(maxlen, flags = 0, outbuf = nil)
144
178
  Polyphony.backend_recv(self, outbuf || +'', maxlen, 0)
145
179
  end
@@ -217,6 +251,23 @@ class ::UNIXServer
217
251
  end
218
252
 
219
253
  class ::UNIXSocket
254
+ alias_method :orig_read, :read
255
+ def read(maxlen = nil, buf = nil, buf_pos = 0)
256
+ return Polyphony.backend_recv(self, buf, maxlen, buf_pos) if buf
257
+ return Polyphony.backend_recv(self, buf || +'', maxlen, 0) if maxlen
258
+
259
+ buf = +''
260
+ len = buf.bytesize
261
+ while true
262
+ Polyphony.backend_recv(self, buf, maxlen || 4096, -1)
263
+ new_len = buf.bytesize
264
+ break if new_len == len
265
+
266
+ len = new_len
267
+ end
268
+ buf
269
+ end
270
+
220
271
  def recv(maxlen, flags = 0, outbuf = nil)
221
272
  Polyphony.backend_recv(self, outbuf || +'', maxlen, 0)
222
273
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.62'
4
+ VERSION = '0.63'
5
5
  end
data/test/test_backend.rb CHANGED
@@ -98,6 +98,32 @@ class BackendTest < MiniTest::Test
98
98
  assert_equal return_value, buf
99
99
  end
100
100
 
101
+ def test_read_concat_big
102
+ i, o = IO.pipe
103
+
104
+ body = " " * 4000
105
+
106
+ data = "post /?q=time&blah=blah HTTP/1\r\nHost: dev.realiteq.net\r\n\r\n" +
107
+ "get /?q=time HTTP/1.1\r\nContent-Length: #{body.bytesize}\r\n\r\n#{body}" +
108
+ "get /?q=time HTTP/1.1\r\nCookie: foo\r\nCookie: bar\r\n\r\n"
109
+
110
+ o << data
111
+ o.close
112
+
113
+ buf = +''
114
+
115
+ @backend.read(i, buf, 4096, false, -1)
116
+ assert_equal 4096, buf.bytesize
117
+
118
+ @backend.read(i, buf, 1, false, -1)
119
+ assert_equal 4097, buf.bytesize
120
+
121
+ @backend.read(i, buf, 4096, false, -1)
122
+
123
+ assert_equal data.bytesize, buf.bytesize
124
+ assert_equal data, buf
125
+ end
126
+
101
127
  def test_waitpid
102
128
  pid = fork do
103
129
  @backend.post_fork
data/test/test_io.rb CHANGED
@@ -73,6 +73,26 @@ class IOTest < MiniTest::Test
73
73
  assert_equal [:wait_readable, 'foo'], results
74
74
  end
75
75
 
76
+ def test_read
77
+ i, o = IO.pipe
78
+
79
+ o << 'hi'
80
+ assert_equal 'hi', i.read(2)
81
+
82
+ o << 'foobarbaz'
83
+ assert_equal 'foo', i.read(3)
84
+ assert_equal 'bar', i.read(3)
85
+
86
+ buf = +'abc'
87
+ assert_equal 'baz', i.read(3, buf)
88
+ assert_equal 'baz', buf
89
+
90
+ buf = +'def'
91
+ o << 'foobar'
92
+ assert_equal 'deffoobar', i.read(6, buf, -1)
93
+ assert_equal 'deffoobar', buf
94
+ end
95
+
76
96
  def test_readpartial
77
97
  i, o = IO.pipe
78
98
 
data/test/test_socket.rb CHANGED
@@ -12,7 +12,6 @@ class SocketTest < MiniTest::Test
12
12
  def test_tcp
13
13
  port = rand(1234..5678)
14
14
  server = TCPServer.new('127.0.0.1', port)
15
-
16
15
  server_fiber = spin do
17
16
  while (socket = server.accept)
18
17
  spin do
@@ -34,6 +33,45 @@ class SocketTest < MiniTest::Test
34
33
  server&.close
35
34
  end
36
35
 
36
+ def test_read
37
+ port = rand(1234..5678)
38
+ server = TCPServer.new('127.0.0.1', port)
39
+ server_fiber = spin do
40
+ while (socket = server.accept)
41
+ spin do
42
+ while (data = socket.read(8192))
43
+ socket << data
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ snooze
50
+ client = TCPSocket.new('127.0.0.1', port)
51
+
52
+ client << 'hi'
53
+ assert_equal 'hi', client.read(2)
54
+
55
+ client << 'foobarbaz'
56
+ assert_equal 'foo', client.read(3)
57
+ assert_equal 'bar', client.read(3)
58
+
59
+ buf = +'abc'
60
+ assert_equal 'baz', client.read(3, buf)
61
+ assert_equal 'baz', buf
62
+
63
+ buf = +'def'
64
+ client << 'foobar'
65
+ assert_equal 'deffoobar', client.read(6, buf, -1)
66
+ assert_equal 'deffoobar', buf
67
+
68
+ client.close
69
+ ensure
70
+ server_fiber&.stop
71
+ server_fiber&.await
72
+ server&.close
73
+ end
74
+
37
75
  # sending multiple strings at once
38
76
  def test_sendv
39
77
  port = rand(1234..5678)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.62'
4
+ version: '0.63'
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-07-21 00:00:00.000000000 Z
11
+ date: 2021-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler