http_streaming_client 0.8.5 → 0.8.6

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
  SHA1:
3
- metadata.gz: d0bb65b843e7e815666b6ad0469c5012fc0bd74f
4
- data.tar.gz: dd6dba01afc281a4466d597d1a133c0cc712bc89
3
+ metadata.gz: 607b852759a7216b85fa6d820d2bc70a2d50b475
4
+ data.tar.gz: 49b554701c78b290e3b7e337a1b8fbcc12f0f726
5
5
  SHA512:
6
- metadata.gz: d3760c04566e74423422331002fc97caefcf630b148a6972693ca318d4f991528bcd4df9f210ac64f004dad1664031ecdaf7e89fbc65b4487f149b6506528e6c
7
- data.tar.gz: d44f9f0ecb13336fcf84d47f33d4b2a1185ac2e18b2f0b235185aa9f57716447171c15dd2af23e9171a4ac34a101c0e57c99d8b78f1068e81a66575ca0220c77
6
+ metadata.gz: c1d07b0e483dc0e81d83800d05d6170d28f00dad305f6e6f3644ffe96b9bac00ff203a7bd34fadf697245b10520cdb1e303b79442dc0bd6bd3a477bb52b99f63
7
+ data.tar.gz: a26cf37f5791d4701ca0f0bf74cdedb009fb1a6d1ee58934f15dfad8a12ffb8c3755a3854c95b496fc2ca22bae69c70e8a04d40c7ada2efd54f41c5ead6ca2d2
data/README.md CHANGED
@@ -43,10 +43,6 @@ Or install it yourself as:
43
43
 
44
44
  $ gem install http_streaming_client
45
45
 
46
- ## Version
47
-
48
- Current release version: 0.8.1 (see <a href="https://github.com/adobe-research/http_streaming_client/releases">RELEASES</a>)
49
-
50
46
  ## Logging
51
47
 
52
48
  HTTP protocol trace logging is available as :debug level logging. The gem supports configurable logging to both STDOUT and a log file, and includes a Railtie to use Rails.logger when the gem is included in a Rails application.
@@ -97,6 +97,7 @@ module HttpStreamingClient
97
97
  end
98
98
 
99
99
  def request(method, uri, opts = {}, &block)
100
+
100
101
  logger.debug("Client::request:#{method}:#{uri}:#{opts}")
101
102
 
102
103
  if uri.is_a?(String)
@@ -166,6 +167,15 @@ module HttpStreamingClient
166
167
 
167
168
  logger.debug "response headers:#{response_head[:headers]}"
168
169
 
170
+ if response_head[:code] == 301 then
171
+ location = response_head[:headers]["Location"]
172
+ raise InvalidRedirect, "Unable to find Location header for HTTP 301 response" if location.nil?
173
+ logger.debug "Received HTTP 301 redirect to #{location}, following..."
174
+ socket.close if !socket.nil? and !socket.closed?
175
+ opts.delete(:socket)
176
+ return request(method, location, opts, &block)
177
+ end
178
+
169
179
  content_length = response_head[:headers]["Content-Length"].to_i
170
180
  logger.debug "content-length: #{content_length}"
171
181
 
@@ -200,11 +210,11 @@ module HttpStreamingClient
200
210
  logger.debug "response compression detected"
201
211
  if block_given? then
202
212
  decoder = HttpStreamingClient::Decoders::GZip.new { |line|
203
- logger.debug "read #{line.size} uncompressed bytes"
213
+ logger.debug "read #{line.size} uncompressed bytes, decoder queue bytes:#{decoder.size}"
204
214
  block.call(line) unless @interrupted }
205
215
  else
206
216
  decoder = HttpStreamingClient::Decoders::GZip.new { |line|
207
- logger.debug "read #{line.size} uncompressed bytes, #{response.size} bytes total"
217
+ logger.debug "read #{line.size} uncompressed bytes, #{response.size} bytes total, decoder queue bytes:#{decoder.size}"
208
218
  response << line unless @interrupted }
209
219
  end
210
220
  end
@@ -237,7 +247,7 @@ module HttpStreamingClient
237
247
  return if @interrupted
238
248
 
239
249
  if response_compression then
240
- decoder << partial
250
+ decoder << partial
241
251
  else
242
252
  if block_given? then
243
253
  yield partial
@@ -274,11 +284,11 @@ module HttpStreamingClient
274
284
 
275
285
  if block_given? then
276
286
  decoder = HttpStreamingClient::Decoders::GZip.new { |line|
277
- logger.debug "read #{line.size} uncompressed bytes"
287
+ logger.debug "read #{line.size} uncompressed bytes, decoder queue bytes:#{decoder.size}"
278
288
  block.call(line) unless @interrupted }
279
289
  else
280
290
  decoder = HttpStreamingClient::Decoders::GZip.new { |line|
281
- logger.debug "read #{line.size} uncompressed bytes, #{response.size} bytes total"
291
+ logger.debug "read #{line.size} uncompressed bytes, #{response.size} bytes total, decoder queue bytes:#{decoder.size}"
282
292
  response << line unless @interrupted }
283
293
  end
284
294
 
@@ -44,10 +44,41 @@ module HttpStreamingClient
44
44
  @packet_callback = packet_callback
45
45
  end
46
46
 
47
+ def nonblock_readline(io)
48
+ @line_buffer ||= ""
49
+ ch = nil
50
+ begin
51
+ while ch = io.getc
52
+ @line_buffer += ch
53
+ if ch == "\n" then
54
+ result = @line_buffer
55
+ @line_buffer = ""
56
+ return result
57
+ end
58
+ end
59
+ rescue Zlib::GzipFile::Error
60
+ # this is raised on EOF by ZLib, return nil to indicate EOF and leave partial line in the buffer
61
+ return nil
62
+ end
63
+ end
64
+
47
65
  def <<(compressed_packet)
48
66
  return unless compressed_packet && compressed_packet.size > 0
49
- decompressed_packet = decompress(compressed_packet)
50
- process_decompressed_packet(decompressed_packet)
67
+ @buf ||= GZipBufferIO.new
68
+ @buf << compressed_packet
69
+
70
+ # pass at least 2k bytes to GzipReader to avoid zlib EOF
71
+ if @buf.size > 2048 then
72
+
73
+ @gzip ||= Zlib::GzipReader.new @buf
74
+
75
+ while true do
76
+ decompressed_packet = nonblock_readline(@gzip)
77
+ #logger.debug "decompressed_packet:#{decompressed_packet}"
78
+ break if decompressed_packet.nil?
79
+ process_decompressed_packet(decompressed_packet)
80
+ end
81
+ end
51
82
  end
52
83
 
53
84
  def close
@@ -55,26 +86,25 @@ module HttpStreamingClient
55
86
  decompressed_packet = ""
56
87
  begin
57
88
  @gzip ||= Zlib::GzipReader.new @buf
58
- decompressed_packet = @gzip.readline
89
+
90
+ while true do
91
+ decompressed_packet = nonblock_readline(@gzip)
92
+ #logger.debug "decompressed_packet:#{decompressed_packet}"
93
+ break if decompressed_packet.nil?
94
+ process_decompressed_packet(decompressed_packet)
95
+ end
96
+
59
97
  rescue Zlib::Error
60
98
  raise DecoderError
61
99
  end
62
- process_decompressed_packet(decompressed_packet)
63
100
  end
64
101
 
65
- protected
66
-
67
- def decompress(compressed_packet)
68
- @buf ||= GZipBufferIO.new
69
- @buf << compressed_packet
70
-
71
- # pass at least 2k bytes to GzipReader to avoid zlib EOF
72
- if @buf.size > 2048
73
- @gzip ||= Zlib::GzipReader.new @buf
74
- @gzip.readline
75
- end
102
+ def size
103
+ @buf.size
76
104
  end
77
105
 
106
+ protected
107
+
78
108
  class GZipBufferIO
79
109
 
80
110
  def logger
@@ -92,21 +122,38 @@ module HttpStreamingClient
92
122
 
93
123
  # called by GzipReader
94
124
  def readpartial(length=nil, buffer=nil)
95
- logger.debug "GZipBufferIO:read:packet_stream:#{@packet_stream.nil? ? 'nil' : 'not nil'}"
125
+ logger.debug "GZipBufferIO:readpartial:length:#{length}:@packet_stream:#{@packet_stream.nil? ? 'nil' : 'not null'}"
96
126
  buffer ||= ""
97
- length ||= 0
127
+
128
+ raise EOFError "" if @packet_stream.size == 0
129
+
130
+ length ||= @packet_stream.size # read all if a fraction is specified
131
+ length = [ length, @packet_stream.size ].min # read length or @packet_stream.size, whichever is smaller
132
+
133
+ #logger.debug "GZipBufferIO:readpartial:before:psize:#{@packet_stream.size}:bsize:#{buffer.size}:length:#{length}"
134
+
98
135
  buffer << @packet_stream[0..(length-1)]
99
- @packet_stream = @packet_stream[length..-1]
136
+
137
+ if length == @packet_stream.size then
138
+ @packet_stream = ""
139
+ else
140
+ @packet_stream = @packet_stream[length..-1]
141
+ end
142
+
143
+ #logger.debug "GZipBufferIO:readpartial:after:psize:#{@packet_stream.size}:bsize:#{buffer.size}"
100
144
  buffer
101
145
  end
102
-
146
+
103
147
  # called by GzipReader
104
148
  def read(length=nil, buffer=nil)
149
+ logger.debug "read:length:#{length}"
150
+ return nil if @packet_stream.size == 0
105
151
  readpartial(length, buffer)
106
152
  end
107
153
 
108
154
  # called by GzipReader
109
155
  def size
156
+ logger.debug "size():#{@packet_stream.size}"
110
157
  @packet_stream.size
111
158
  end
112
159
  end
@@ -116,7 +163,7 @@ module HttpStreamingClient
116
163
  def process_decompressed_packet(decompressed_packet)
117
164
  logger.debug "GZipBufferIO:process_decompressed_packet:size:#{decompressed_packet.nil? ? "nil" : decompressed_packet.size}"
118
165
  if decompressed_packet && decompressed_packet.size > 0
119
- @packet_callback.call(decompressed_packet)
166
+ @packet_callback.call(decompressed_packet) unless @packet_callback.nil?
120
167
  end
121
168
  end
122
169
 
@@ -30,6 +30,8 @@
30
30
  module HttpStreamingClient
31
31
 
32
32
  class InvalidContentType < Exception; end
33
+
34
+ class InvalidRedirect < Exception; end
33
35
 
34
36
  class HttpTimeOut < StandardError; end
35
37
 
@@ -28,5 +28,5 @@
28
28
  ###########################################################################
29
29
 
30
30
  module HttpStreamingClient
31
- VERSION = "0.8.5"
31
+ VERSION = "0.8.6"
32
32
  end
data/spec/client_spec.rb CHANGED
@@ -9,9 +9,17 @@ describe HttpStreamingClient do
9
9
  it { should_not be_nil}
10
10
  end
11
11
 
12
- describe "client instance get test" do
12
+ describe "client instance get test, no chunked transfer encosing and GZIP compression" do
13
13
  client = HttpStreamingClient::Client.new
14
- response = client.get "http://www.google.com/"
14
+ response = client.get "http://screamradius.com/"
15
+ logger.debug "response: #{response}"
16
+ subject { response }
17
+ it { should_not be_nil}
18
+ end
19
+
20
+ describe "client instance get test, test 301 redirect" do
21
+ client = HttpStreamingClient::Client.new(compression: true)
22
+ response = client.get("https://www.ebay.com/")
15
23
  logger.debug "response: #{response}"
16
24
  subject { response }
17
25
  it { should_not be_nil}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_streaming_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Tompkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-10 00:00:00.000000000 Z
11
+ date: 2014-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler