httpclient 2.3.0 → 2.3.0.1

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.
@@ -542,7 +542,7 @@ module HTTP
542
542
  # bear in mind that server may not support it. at least ruby's CGI doesn't.
543
543
  @body = body
544
544
  remember_pos(@body)
545
- @size = (body.size - body.pos) rescue body.size if body.respond_to?(:size)
545
+ @size = body.respond_to?(:size) ? body.size - body.pos : nil
546
546
  elsif boundary and Message.multiparam_query?(body)
547
547
  @body = build_query_multipart_str(body, boundary)
548
548
  @size = @body.size
@@ -554,45 +554,27 @@ module HTTP
554
554
 
555
555
  def remember_pos(io)
556
556
  # IO may not support it (ex. IO.pipe)
557
- @positions[io] = io.pos rescue nil if io.respond_to?(:pos)
557
+ @positions[io] = io.pos if io.respond_to?(:pos)
558
558
  end
559
559
 
560
560
  def reset_pos(io)
561
- io.pos = @positions[io] if @positions[io]
561
+ io.pos = @positions[io] if @positions.key?(io)
562
562
  end
563
563
 
564
564
  def dump_file(io, dev)
565
- return dump_file_length(io, @size, dev) if @size
566
565
  buf = ''
567
566
  while !io.read(@chunk_size, buf).nil?
568
567
  dev << buf
569
568
  end
570
569
  end
571
570
 
572
- def dump_file_length(io, size, dev)
573
- buf = ''
574
- while size > 0 && !(read = io.read(size > @chunk_size ? @chunk_size : size, buf)).nil?
575
- dev << buf
576
- size -= read.bytesize
577
- end
578
- end
579
-
580
571
  def dump_chunks(io, dev)
581
- return dump_chunks_length(io, io.size, dev) if io.respond_to?(:size) && io.size
582
572
  buf = ''
583
573
  while !io.read(@chunk_size, buf).nil?
584
574
  dev << dump_chunk(buf)
585
575
  end
586
576
  end
587
577
 
588
- def dump_chunks_length(io, size, dev)
589
- buf = ''
590
- while size > 0 && !(read = io.read(size > @chunk_size ? @chunk_size : size, buf)).nil?
591
- dev << dump_chunk(buf)
592
- size -= read.bytesize
593
- end
594
- end
595
-
596
578
  def dump_chunk(str)
597
579
  dump_chunk_size(str.bytesize) + (str + CRLF)
598
580
  end
@@ -618,8 +600,18 @@ module HTTP
618
600
  if Message.file?(part)
619
601
  @as_stream = true
620
602
  @body << part
621
- # use chunked upload
622
- @size = nil
603
+ if part.respond_to?(:lstat)
604
+ @size += part.lstat.size
605
+ elsif part.respond_to?(:size)
606
+ if sz = part.size
607
+ @size += sz
608
+ else
609
+ @size = nil
610
+ end
611
+ else
612
+ # use chunked upload
613
+ @size = nil
614
+ end
623
615
  elsif @body[-1].is_a?(String)
624
616
  @body[-1] += part.to_s
625
617
  @size += part.to_s.bytesize if @size
@@ -23,6 +23,10 @@ class HTTPClient
23
23
  require 'uri'
24
24
  begin
25
25
  require 'addressable/uri'
26
+ # Older versions doesn't have #default_port
27
+ unless Addressable::URI.instance_methods.include?(:default_port) # 1.9 only
28
+ raise LoadError
29
+ end
26
30
  class AddressableURI < Addressable::URI
27
31
  # Overwrites the original definition just for one line...
28
32
  def authority
@@ -1,3 +1,3 @@
1
1
  class HTTPClient
2
- VERSION = '2.3.0'
2
+ VERSION = '2.3.0.1'
3
3
  end
@@ -748,6 +748,19 @@ EOS
748
748
  end
749
749
  end
750
750
 
751
+ def test_post_with_file_without_size
752
+ STDOUT.sync = true
753
+ File.open(__FILE__) do |file|
754
+ def file.size
755
+ # Simulates some strange Windows behaviour
756
+ raise SystemCallError.new "Unknown Error (20047)"
757
+ end
758
+ assert_nothing_raised do
759
+ @client.post(serverurl + 'servlet', {1=>2, 3=>file})
760
+ end
761
+ end
762
+ end
763
+
751
764
  def test_post_with_io # streaming, but not chunked
752
765
  myio = StringIO.new("X" * (HTTP::Message::Body::DEFAULT_CHUNK_SIZE + 1))
753
766
  def myio.read(*args)
@@ -764,7 +777,7 @@ EOS
764
777
  assert_match(/\r\n2\r\n/m, res.content)
765
778
  assert_match(/\r\nContent-Disposition: form-data; name="3"; filename=""\r\n/m, res.content)
766
779
  assert_match(/\r\nContent-Length:/m, str.string)
767
- assert_equal(2, myio.called, 'should just read 2 times, no need to extra read for detecting EOF')
780
+ assert_equal(3, myio.called)
768
781
  end
769
782
 
770
783
  def test_post_with_io_nosize # streaming + chunked post
@@ -781,26 +794,6 @@ EOS
781
794
  assert_match(/\r\nTransfer-Encoding: chunked\r\n/m, str.string)
782
795
  end
783
796
 
784
- def test_post_with_sized_io
785
- myio = StringIO.new("45")
786
- def myio.size
787
- 1
788
- end
789
- @client.debug_dev = str = StringIO.new
790
- res = @client.post(serverurl + 'servlet', myio)
791
- assert_match(/\r\n4\n/, str.string, 'should send "4" not "45"')
792
- end
793
-
794
- def test_post_with_sized_io_chunked
795
- myio = StringIO.new("45")
796
- def myio.size
797
- 1
798
- end
799
- @client.debug_dev = str = StringIO.new
800
- res = @client.post(serverurl + 'servlet', {:file => myio})
801
- assert_match(/\r\n4\r\n/, str.string, 'should send "4" not "45"')
802
- end
803
-
804
797
  def test_post_async
805
798
  param = {'1'=>'2', '3'=>'4'}
806
799
  conn = @client.post_async(serverurl + 'servlet', param)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.3.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-10 00:00:00.000000000 Z
12
+ date: 2012-10-11 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: nahi@ruby-lang.org
@@ -90,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  segments:
92
92
  - 0
93
- hash: -478554732977301043
93
+ hash: 926508888754393425
94
94
  required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
@@ -99,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  version: '0'
100
100
  segments:
101
101
  - 0
102
- hash: -478554732977301043
102
+ hash: 926508888754393425
103
103
  requirements: []
104
104
  rubyforge_project:
105
105
  rubygems_version: 1.8.23