net-http-pipeline 1.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,9 @@
1
+ === 1.0.1 / 2012-04-13
2
+
3
+ * Bug fixes
4
+ * IOError is now handled in pipeline_check and pipeline_receive in case you
5
+ pipeline to a closed socket. Partial patch by Eric Wong. Issue #2
6
+
1
7
  === 1.0 / 2011-03-29
2
8
 
3
9
  * API change
@@ -4,5 +4,5 @@ Manifest.txt
4
4
  README.txt
5
5
  Rakefile
6
6
  lib/net/http/pipeline.rb
7
- sample/two_get.rb
7
+ sample/pipeline.rb
8
8
  test/test_net_http_pipeline.rb
data/README.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  = net-http-pipeline
2
2
 
3
- * http://seattlerb.rubyforge.org/net-http-pipeline
3
+ * http://docs.seattlerb.org/net-http-pipeline
4
4
  * http://github.com/drbrain/net-http-pipeline
5
5
 
6
6
  == DESCRIPTION:
@@ -12,8 +12,6 @@ The server will respond in-order.
12
12
  == FEATURES/PROBLEMS:
13
13
 
14
14
  * Provides HTTP/1.1 pipelining
15
- * Does not implement request wrangling per RFC 2616 8.1.2.2
16
- * Does not handle errors
17
15
 
18
16
  == SYNOPSIS:
19
17
 
data/Rakefile CHANGED
@@ -5,13 +5,15 @@ require 'hoe'
5
5
 
6
6
  Hoe.plugin :git
7
7
  Hoe.plugin :minitest
8
- Hoe.plugins.delete :rubyforge
8
+ Hoe.plugin :travis
9
9
 
10
10
  Hoe.spec 'net-http-pipeline' do
11
11
  developer 'Eric Hodel', 'drbrain@segment7.net'
12
12
 
13
13
  rdoc_locations <<
14
14
  'docs.seattlerb.org:/data/www/docs.seattlerb.org/net-http-pipeline/'
15
+ rdoc_locations <<
16
+ 'rubyforge.org:/var/www/gforge-projects/seattlerb/net-http-pipeline/'
15
17
  end
16
18
 
17
19
  # vim: syntax=Ruby
@@ -34,7 +34,7 @@ module Net::HTTP::Pipeline
34
34
  ##
35
35
  # The version of net-http-pipeline you are using
36
36
 
37
- VERSION = '1.0'
37
+ VERSION = '1.0.1'
38
38
 
39
39
  ##
40
40
  # Pipeline error class
@@ -223,7 +223,7 @@ module Net::HTTP::Pipeline
223
223
  begin
224
224
  res = request req
225
225
  rescue Timeout::Error, EOFError, Errno::ECONNABORTED, Errno::ECONNRESET,
226
- Errno::EPIPE, Net::HTTPBadResponse => e
226
+ Errno::EPIPE, Net::HTTPBadResponse, IOError => e
227
227
  if retried then
228
228
  requests.unshift req
229
229
  raise ResponseError.new(e, requests, responses)
@@ -312,7 +312,7 @@ module Net::HTTP::Pipeline
312
312
 
313
313
  responses
314
314
  rescue Timeout::Error, EOFError, Errno::ECONNABORTED, Errno::ECONNRESET,
315
- Errno::EPIPE, Net::HTTPBadResponse => e
315
+ Errno::EPIPE, Net::HTTPBadResponse, IOError => e
316
316
  pipeline_finish
317
317
 
318
318
  raise ResponseError.new(e, in_flight, responses)
@@ -0,0 +1,21 @@
1
+ require 'net/http/pipeline'
2
+
3
+ http = Net::HTTP.new 'localhost'
4
+ http.set_debug_output $stderr # so you can see what is happening
5
+ # http.pipelining = true # set this when localhost:80 is an HTTP/1.1 server
6
+
7
+ http.start do |http|
8
+ reqs = []
9
+ reqs << Net::HTTP::Get.new('/?a') # this request will be non-pipelined
10
+ # to check if localhost:80 is HTTP/1.1
11
+ # unless http.pipelining == true
12
+ reqs << Net::HTTP::Get.new('/?b') # these requests will be pipelined
13
+ reqs << Net::HTTP::Get.new('/?c')
14
+
15
+ http.pipeline reqs do |res|
16
+ puts res.code
17
+ puts res.body[0..60].inspect
18
+ puts
19
+ end
20
+ end
21
+
@@ -14,6 +14,17 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
14
14
  @get2 = Net::HTTP::Get.new '/'
15
15
  @get3 = Net::HTTP::Get.new '/'
16
16
  @post = Net::HTTP::Post.new '/'
17
+
18
+ remove_start
19
+
20
+ def start
21
+ end
22
+ end
23
+
24
+ def remove_start
25
+ class << self
26
+ alias_method :old_start, :start if method_defined? :start
27
+ end
17
28
  end
18
29
 
19
30
  ##
@@ -147,9 +158,6 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
147
158
  r
148
159
  end
149
160
 
150
- def start
151
- end
152
-
153
161
  def started?() @started end
154
162
 
155
163
  # tests start
@@ -273,6 +281,8 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
273
281
 
274
282
  @socket = @error_socket
275
283
 
284
+ remove_start
285
+
276
286
  def start
277
287
  @socket = @good_socket
278
288
  end
@@ -337,6 +347,8 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
337
347
 
338
348
  @sockets = [@error_socket2, @good_socket]
339
349
 
350
+ remove_start
351
+
340
352
  def start
341
353
  @socket = @sockets.shift
342
354
  end
@@ -378,6 +390,8 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
378
390
 
379
391
  @socket = @error_socket
380
392
 
393
+ remove_start
394
+
381
395
  def start
382
396
  @socket = @error_socket2
383
397
  end
@@ -446,6 +460,8 @@ class TestNetHttpPipeline < MiniTest::Unit::TestCase
446
460
  @socket2.read_io.write http_response('Worked 1!')
447
461
  @socket2.start
448
462
 
463
+ remove_start
464
+
449
465
  def start
450
466
  @socket = @socket2
451
467
  end
@@ -481,6 +497,23 @@ Worked 1!
481
497
  refute pipelining
482
498
  end
483
499
 
500
+ def test_pipeline_check_ioerror
501
+ @socket = Buffer.new IOError, true
502
+ @socket.read_io.write http_response('Worked 1!')
503
+ @socket.start
504
+
505
+ requests = [@get1, @get2]
506
+ responses = []
507
+
508
+ assert_raises Net::HTTP::Pipeline::ResponseError do
509
+ pipeline_check requests, responses
510
+ end
511
+
512
+ assert_equal [@get1, @get2], requests
513
+ assert_equal 0, responses.length
514
+ refute pipelining
515
+ end
516
+
484
517
  def test_pipeline_check_non_persistent
485
518
  @socket = Buffer.new
486
519
  @socket.read_io.write http_response('Worked 1!', 'Connection: close')
@@ -592,6 +625,29 @@ Worked 1!
592
625
  assert_kind_of Errno::ECONNRESET, e.original
593
626
  end
594
627
 
628
+ def test_pipeline_receive_ioerror
629
+ @socket = Buffer.new IOError
630
+ @socket.read_io.write http_response('Worked 1!')
631
+ @socket.start
632
+
633
+ in_flight = [@get1, @get2]
634
+ responses = []
635
+
636
+ e = assert_raises Net::HTTP::Pipeline::ResponseError do
637
+ pipeline_receive in_flight, responses
638
+ end
639
+
640
+ @socket.finish
641
+
642
+ assert @socket.closed?
643
+
644
+ assert_equal [@get2], e.requests
645
+ assert_equal 1, e.responses.length
646
+ assert_equal 'Worked 1!', e.responses.first.body
647
+
648
+ assert_kind_of IOError, e.original
649
+ end
650
+
595
651
  def test_pipeline_receive_timeout
596
652
  @socket = Buffer.new Timeout::Error
597
653
  @socket.read_io.write http_response('Worked 1!')
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-http-pipeline
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- version: "1.0"
9
+ - 1
10
+ version: 1.0.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Eric Hodel
@@ -15,9 +16,9 @@ bindir: bin
15
16
  cert_chain:
16
17
  - |
17
18
  -----BEGIN CERTIFICATE-----
18
- MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
19
+ MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
19
20
  YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
20
- ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
21
+ ZXQwHhcNMTIwMjI4MTc1NDI1WhcNMTMwMjI3MTc1NDI1WjBBMRAwDgYDVQQDDAdk
21
22
  cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
22
23
  FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
23
24
  LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
@@ -25,18 +26,18 @@ cert_chain:
25
26
  Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
26
27
  mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
27
28
  g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
28
- sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
29
- BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
30
- kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
31
- bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
32
- DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
33
- UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
34
- 14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
35
- x52qPcexcYZR7w==
29
+ sCANiQ8BAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
30
+ BBS5k4Z75VSpdM0AclG2UvzFA/VW5DAfBgNVHREEGDAWgRRkcmJyYWluQHNlZ21l
31
+ bnQ3Lm5ldDAfBgNVHRIEGDAWgRRkcmJyYWluQHNlZ21lbnQ3Lm5ldDANBgkqhkiG
32
+ 9w0BAQUFAAOCAQEAPeWzFnrcvC6eVzdlhmjUub2s6qieBkongKRDHQz5MEeQv4LS
33
+ SARnoHY+uCAVL/1xGAhmpzqQ3fJGWK9eBacW/e8E5GF9xQcV3mE1bA0WNaiDlX5j
34
+ U2aI+ZGSblqvHUCxKBHR1s7UMHsbz1saOmgdRTyPx0juJs68ocbUTeYBLWu9V4KP
35
+ zdGAG2JXO2gONg3b4tYDvpBLbry+KOX27iAJulUaH9TiTOULL4ITJVFsK0mYVqmR
36
+ Q8Tno9S3e4XGGP1ZWfLrTWEJbavFfhGHut2iMRwfC7s/YILAHNATopaJdH9DNpd1
37
+ U81zGHMUBOvz/VGT6wJwYJ3emS2nfA2NOHFfgA==
36
38
  -----END CERTIFICATE-----
37
39
 
38
- date: 2011-03-29 00:00:00 -07:00
39
- default_executable:
40
+ date: 2012-04-13 00:00:00 Z
40
41
  dependencies:
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: minitest
@@ -44,32 +45,45 @@ dependencies:
44
45
  requirement: &id001 !ruby/object:Gem::Requirement
45
46
  none: false
46
47
  requirements:
47
- - - ">="
48
+ - - ~>
48
49
  - !ruby/object:Gem::Version
49
- hash: 11
50
+ hash: 21
50
51
  segments:
51
52
  - 2
52
- - 0
53
- - 2
54
- version: 2.0.2
53
+ - 11
54
+ version: "2.11"
55
55
  type: :development
56
56
  version_requirements: *id001
57
57
  - !ruby/object:Gem::Dependency
58
- name: hoe
58
+ name: rdoc
59
59
  prerelease: false
60
60
  requirement: &id002 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
- - - ">="
63
+ - - ~>
64
64
  - !ruby/object:Gem::Version
65
- hash: 41
65
+ hash: 19
66
66
  segments:
67
- - 2
68
- - 9
69
- - 1
70
- version: 2.9.1
67
+ - 3
68
+ - 10
69
+ version: "3.10"
71
70
  type: :development
72
71
  version_requirements: *id002
72
+ - !ruby/object:Gem::Dependency
73
+ name: hoe
74
+ prerelease: false
75
+ requirement: &id003 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ hash: 35
81
+ segments:
82
+ - 2
83
+ - 16
84
+ version: "2.16"
85
+ type: :development
86
+ version_requirements: *id003
73
87
  description: |-
74
88
  An HTTP/1.1 pipelining implementation atop Net::HTTP. A pipelined connection
75
89
  sends multiple requests to the HTTP server without waiting for the responses.
@@ -91,11 +105,10 @@ files:
91
105
  - README.txt
92
106
  - Rakefile
93
107
  - lib/net/http/pipeline.rb
94
- - sample/two_get.rb
108
+ - sample/pipeline.rb
95
109
  - test/test_net_http_pipeline.rb
96
110
  - .gemtest
97
- has_rdoc: true
98
- homepage: http://seattlerb.rubyforge.org/net-http-pipeline
111
+ homepage: http://docs.seattlerb.org/net-http-pipeline
99
112
  licenses: []
100
113
 
101
114
  post_install_message:
@@ -125,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
138
  requirements: []
126
139
 
127
140
  rubyforge_project: net-http-pipeline
128
- rubygems_version: 1.6.2
141
+ rubygems_version: 1.8.21
129
142
  signing_key:
130
143
  specification_version: 3
131
144
  summary: An HTTP/1.1 pipelining implementation atop Net::HTTP
metadata.gz.sig CHANGED
Binary file
@@ -1,12 +0,0 @@
1
- require 'net/http/pipeline'
2
-
3
- Net::HTTP.start 'localhost' do |http|
4
- req1 = Net::HTTP::Get.new '/'
5
- req2 = Net::HTTP::Get.new '/'
6
-
7
- http.pipeline req1, req2 do |res|
8
- puts res.code
9
- puts res.body[0..60].inspect
10
- puts
11
- end
12
- end