From 35e67132820bf94d94cd7e10b666377cb00cbd9e Mon Sep 17 00:00:00 2001 From: James Edward Gray II Date: Fri, 6 Feb 2009 11:13:25 -0600 Subject: [PATCH 1/2] Addressing an issue that causes some successful responses to raise RequestFailed. --- lib/restclient/request.rb | 2 +- spec/request_spec.rb | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/restclient/request.rb b/lib/restclient/request.rb index 0149f3a..7c5f7af 100644 --- a/lib/restclient/request.rb +++ b/lib/restclient/request.rb @@ -114,7 +114,7 @@ module RestClient end def process_result(res) - if %w(200 201 202).include? res.code + if res.code =~ /\A2\d{2}\z/ decode res['content-encoding'], res.body elsif %w(301 302 303).include? res.code url = res.header['Location'] diff --git a/spec/request_spec.rb b/spec/request_spec.rb index 59afb94..59475a7 100644 --- a/spec/request_spec.rb +++ b/spec/request_spec.rb @@ -33,13 +33,23 @@ describe RestClient::Request do @request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363").should == "some deflated text" end - it "processes a successful result" do - res = mock("result") - res.stub!(:code).and_return("200") - res.stub!(:body).and_return('body') - res.stub!(:[]).with('content-encoding').and_return(nil) - @request.process_result(res).should == 'body' - end + it "processes a successful result" do + res = mock("result") + res.stub!(:code).and_return("200") + res.stub!(:body).and_return('body') + res.stub!(:[]).with('content-encoding').and_return(nil) + @request.process_result(res).should == 'body' + end + + it "doesn't classify successful requests as failed" do + 203.upto(206) do |code| + res = mock("result") + res.stub!(:code).and_return(code.to_s) + res.stub!(:body).and_return("") + res.stub!(:[]).with('content-encoding').and_return(nil) + @request.process_result(res).should be_empty + end + end it "parses a url into a URI object" do URI.should_receive(:parse).with('http://example.com/resource') From 040544e952a9126d7a98cefe011ef12a634c8feb Mon Sep 17 00:00:00 2001 From: James Edward Gray II Date: Fri, 6 Feb 2009 11:34:03 -0600 Subject: [PATCH 2/2] Resolving an issue where a Content-Encoding header mixed with an empty body would raise an exception as Zlib choked on the data. --- lib/restclient/request.rb | 2 +- spec/request_spec.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/restclient/request.rb b/lib/restclient/request.rb index 7c5f7af..3857c72 100644 --- a/lib/restclient/request.rb +++ b/lib/restclient/request.rb @@ -138,7 +138,7 @@ module RestClient end def decode(content_encoding, body) - if content_encoding == 'gzip' + if content_encoding == 'gzip' and not body.empty? Zlib::GzipReader.new(StringIO.new(body)).read elsif content_encoding == 'deflate' Zlib::Inflate.new.inflate(body) diff --git a/spec/request_spec.rb b/spec/request_spec.rb index 59475a7..5b32df0 100644 --- a/spec/request_spec.rb +++ b/spec/request_spec.rb @@ -28,6 +28,10 @@ describe RestClient::Request do it "decodes a gzip body" do @request.decode('gzip', "\037\213\b\b\006'\252H\000\003t\000\313T\317UH\257\312,HM\341\002\000G\242(\r\v\000\000\000").should == "i'm gziped\n" end + + it "ingores gzip for empty bodies" do + @request.decode('gzip', '').should be_empty + end it "decodes a deflated body" do @request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363").should == "some deflated text"