diff --git a/lib/rest_client.rb b/lib/rest_client.rb index d62b4a45..acc55a96 100644 --- a/lib/rest_client.rb +++ b/lib/rest_client.rb @@ -148,10 +148,12 @@ def transmit(uri, req, payload) net = Net::HTTP.new(uri.host, uri.port) net.use_ssl = uri.is_a?(URI::HTTPS) - display_log(log) + display_log request_log net.start do |http| - process_result http.request(req, payload || "") + res = http.request(req, payload || "") + display_log response_log(res) + process_result res end rescue EOFError raise RestClient::ServerBrokeConnection @@ -185,7 +187,7 @@ def process_result(res) end end - def log + def request_log if @payload if @payload.size > 100 "RestClient.#{method} '#{url}', '(#{payload.size} byte payload)'" @@ -197,6 +199,10 @@ def log end end + def response_log(res) + "# => #{res.code} #{res.class.to_s.gsub(/^Net::HTTP/, '')} | #{res['Content-type'].gsub(/;.*$/, '')} #{res.body.size} bytes" + end + def display_log(msg) return unless log_to = RestClient.log diff --git a/spec/rest_client_spec.rb b/spec/rest_client_spec.rb index 8cfc82f3..a2108ea4 100644 --- a/spec/rest_client_spec.rb +++ b/spec/rest_client_spec.rb @@ -129,6 +129,7 @@ it "transmits the request with Net::HTTP" do @http.should_receive(:request).with('req', 'payload') @request.should_receive(:process_result) + @request.should_receive(:response_log) @request.transmit(@uri, 'req', 'payload') end @@ -137,12 +138,14 @@ @net.should_receive(:use_ssl=).with(true) @http.stub!(:request) @request.stub!(:process_result) + @request.stub!(:response_log) @request.transmit(@uri, 'req', 'payload') end it "doesn't send nil payloads" do @http.should_receive(:request).with('req', '') @request.should_receive(:process_result) + @request.stub!(:response_log) @request.transmit(@uri, 'req', nil) end @@ -169,6 +172,7 @@ it "sets up the credentials prior to the request" do @http.stub!(:request) @request.stub!(:process_result) + @request.stub!(:response_log) @request.stub!(:user).and_return('joe') @request.stub!(:password).and_return('mypass') @@ -240,21 +244,33 @@ lambda { @request.process_result(res) }.should raise_error(RestClient::RequestFailed) end - it "logs a get" do - RestClient::Request.new(:method => :get, :url => 'http://url').log.should == + it "logs a get request" do + RestClient::Request.new(:method => :get, :url => 'http://url').request_log.should == "RestClient.get 'http://url'" end - it "logs a post with a small payload" do - RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').log.should == + it "logs a post request with a small payload" do + RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').request_log.should == "RestClient.post 'http://url', 'foo'" end - it "logs a post with a long payload" do - RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).log.should == + it "logs a post request with a large payload" do + RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).request_log.should == "RestClient.post 'http://url', '(1000 byte payload)'" end + it "logs a response including the status code, content type, and result body size in bytes" do + res = mock('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd') + res.stub!(:[]).with('Content-type').and_return('text/html') + @request.response_log(res).should == "# => 200 OK | text/html 4 bytes" + end + + it "strips the charset from the response content type" do + res = mock('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd') + res.stub!(:[]).with('Content-type').and_return('text/html; charset=utf-8') + @request.response_log(res).should == "# => 200 OK | text/html 4 bytes" + end + it "displays the log to stdout" do RestClient.stub!(:log).and_return('stdout') STDOUT.should_receive(:puts).with('xyz')