diff --git a/history.md b/history.md index 38dc648..5ae5ad0 100644 --- a/history.md +++ b/history.md @@ -1,6 +1,7 @@ # 1.5.1 - only converts headers keys which are Symbols +- use CGI for cookie parsing instead of custom code # 1.5.0 diff --git a/lib/restclient/abstract_response.rb b/lib/restclient/abstract_response.rb index a631ba4..39d2c75 100644 --- a/lib/restclient/abstract_response.rb +++ b/lib/restclient/abstract_response.rb @@ -1,3 +1,5 @@ +require 'cgi' + module RestClient module AbstractResponse @@ -22,15 +24,11 @@ module RestClient # Hash of cookies extracted from response headers def cookies - @cookies ||= (self.headers[:set_cookie] || []).inject({}) do |out, cookie_content| - # correctly parse comma-separated cookies containing HTTP dates (which also contain a comma) - cookie_content.split(/,\s*/).inject([""]) { |array, blob| - blob =~ /expires=.+?$/ ? array.push(blob) : array.last.concat(blob) - array - }.each do |cookie| - next if cookie.empty? - key, *val = cookie.split(";").first.split("=") - out[key] = val.join("=") + @cookies ||= (self.headers[:set_cookie] || {}).inject({}) do |out, cookie_content| + CGI::Cookie::parse(cookie_content).each do |key, cookie| + unless ['expires', 'path'].include? key + out[key] = cookie.value[0] || '' + end end out end diff --git a/spec/abstract_response_spec.rb b/spec/abstract_response_spec.rb index 281c1f9..6e95581 100644 --- a/spec/abstract_response_spec.rb +++ b/spec/abstract_response_spec.rb @@ -51,6 +51,11 @@ describe RestClient::AbstractResponse do @response.cookies.should == { 'session_id' => '1' } end + it "extract strange cookies" do + @net_http_res.should_receive(:to_hash).and_return('set-cookie' => ['session_id=ZJ/HQVH6YE+rVkTpn0zvTQ==; path=/']) + @response.cookies.should == { 'session_id' => 'ZJ/HQVH6YE rVkTpn0zvTQ==' } + end + it "can access the net http result directly" do @response.net_http_res.should == @net_http_res end