alovak-network 1.1.0 → 1.1.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.
- data/lib/network.rb +2 -5
- data/lib/network/connection.rb +48 -14
- data/test/network/test_connection.rb +44 -18
- data/test/test_helper.rb +3 -4
- metadata +2 -2
    
        data/lib/network.rb
    CHANGED
    
    
    
        data/lib/network/connection.rb
    CHANGED
    
    | @@ -1,4 +1,18 @@ | |
| 1 1 | 
             
            module Network
         | 
| 2 | 
            +
              class Error < Exception
         | 
| 3 | 
            +
              end
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              class ResponseError < Error
         | 
| 6 | 
            +
                attr_reader :response
         | 
| 7 | 
            +
                def initialize(response)
         | 
| 8 | 
            +
                  @response = response
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def to_s
         | 
| 12 | 
            +
                  "Failed with #{@response.code} #{@response.message if @response.respond_to?(:message)}"
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 2 16 | 
             
              class Connection
         | 
| 3 17 | 
             
                attr_reader   :uri, :pem
         | 
| 4 18 |  | 
| @@ -22,17 +36,14 @@ module Network | |
| 22 36 | 
             
                end
         | 
| 23 37 |  | 
| 24 38 | 
             
                def post(data)
         | 
| 25 | 
            -
                   | 
| 39 | 
            +
                  try_request do
         | 
| 26 40 | 
             
                    log_request(data)
         | 
| 27 | 
            -
                     | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
                     | 
| 32 | 
            -
             | 
| 33 | 
            -
                    raise Error, "The remote server reset the connection"
         | 
| 34 | 
            -
                  rescue Errno::ECONNREFUSED
         | 
| 35 | 
            -
                    raise Error, "The connection was refused by the remote server"
         | 
| 41 | 
            +
                    response = nil
         | 
| 42 | 
            +
                    ms = Benchmark.realtime do 
         | 
| 43 | 
            +
                      response = http.post(uri.path, data, post_headers(data))
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                    log_response(response, ms)
         | 
| 46 | 
            +
                    handle_response(response)
         | 
| 36 47 | 
             
                  end
         | 
| 37 48 | 
             
                end
         | 
| 38 49 |  | 
| @@ -55,9 +66,32 @@ module Network | |
| 55 66 | 
             
                  http
         | 
| 56 67 | 
             
                end
         | 
| 57 68 |  | 
| 69 | 
            +
                def handle_response(response)
         | 
| 70 | 
            +
                  case response.code.to_i
         | 
| 71 | 
            +
                  when 200...300
         | 
| 72 | 
            +
                    response.body
         | 
| 73 | 
            +
                  else
         | 
| 74 | 
            +
                    raise ResponseError.new(response)
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                def try_request(&block)
         | 
| 79 | 
            +
                  begin
         | 
| 80 | 
            +
                    block.call
         | 
| 81 | 
            +
                  rescue Timeout::Error, Errno::ETIMEDOUT, Timeout::ExitException
         | 
| 82 | 
            +
                    raise Error, "The connection to the remote server is timed out"
         | 
| 83 | 
            +
                  rescue EOFError
         | 
| 84 | 
            +
                    raise Error, "The connection to the remote server was dropped"
         | 
| 85 | 
            +
                  rescue Errno::ECONNRESET, Errno::ECONNABORTED
         | 
| 86 | 
            +
                    raise Error, "The remote server reset the connection"
         | 
| 87 | 
            +
                  rescue Errno::ECONNREFUSED
         | 
| 88 | 
            +
                    raise Error, "The connection was refused by the remote server"
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 58 92 | 
             
                def post_headers(data)
         | 
| 59 93 | 
             
                  @headers['Content-Type']   ||= 'application/x-www-form-urlencoded'
         | 
| 60 | 
            -
                  @headers['Content-Length'] ||= data. | 
| 94 | 
            +
                  @headers['Content-Length'] ||= data.bytesize.to_s
         | 
| 61 95 | 
             
                  @headers
         | 
| 62 96 | 
             
                end
         | 
| 63 97 |  | 
| @@ -105,9 +139,9 @@ module Network | |
| 105 139 | 
             
                  log (request_filter ? request_filter.call(data) : data)
         | 
| 106 140 | 
             
                end
         | 
| 107 141 |  | 
| 108 | 
            -
                def log_response( | 
| 109 | 
            -
                  log " | 
| 110 | 
            -
                  log (response_filter ? response_filter.call( | 
| 142 | 
            +
                def log_response(response, ms_time = -1)
         | 
| 143 | 
            +
                  log "<-- %s %s (%d bytes %.2fms)" % [response.code, response.message, (response.body ? response.body.bytesize : 0), ms_time]
         | 
| 144 | 
            +
                  log (response_filter ? response_filter.call(response.body) : response.body) if response.body
         | 
| 111 145 | 
             
                  log "----"
         | 
| 112 146 | 
             
                end
         | 
| 113 147 | 
             
              end
         | 
| @@ -9,7 +9,10 @@ class TestLogger | |
| 9 9 | 
             
              end
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 | 
            +
            ResponseStub = Struct.new(:code, :message, :body)
         | 
| 13 | 
            +
             | 
| 12 14 | 
             
            class TestConnectionLogging < Test::Unit::TestCase
         | 
| 15 | 
            +
             | 
| 13 16 | 
             
              def setup
         | 
| 14 17 | 
             
                @connection = Network::Connection.new("http://example.com/path")
         | 
| 15 18 | 
             
                @connection.logger = TestLogger.new
         | 
| @@ -31,10 +34,11 @@ class TestConnectionLogging < Test::Unit::TestCase | |
| 31 34 | 
             
              end
         | 
| 32 35 |  | 
| 33 36 | 
             
              def test_log_response
         | 
| 34 | 
            -
                 | 
| 37 | 
            +
                response = ResponseStub.new("200", "OK", "response data")
         | 
| 38 | 
            +
                @connection.send(:log_response, response, 0.16)
         | 
| 35 39 | 
             
                log = @connection.logger.log
         | 
| 36 40 |  | 
| 37 | 
            -
                assert_match  | 
| 41 | 
            +
                assert_match /<-- 200 OK \(13 bytes 0.16ms\)/,    log
         | 
| 38 42 | 
             
                assert_match /response data/,           log
         | 
| 39 43 | 
             
                assert_match /----/,                    log
         | 
| 40 44 | 
             
              end
         | 
| @@ -46,13 +50,15 @@ class TestConnectionLogging < Test::Unit::TestCase | |
| 46 50 | 
             
              end
         | 
| 47 51 |  | 
| 48 52 | 
             
              def test_response_filtering
         | 
| 53 | 
            +
                response = ResponseStub.new("200", "OK", "response")
         | 
| 49 54 | 
             
                @connection.response_filter = Proc.new {|req| "#{req} is filtered"}
         | 
| 50 | 
            -
                @connection.send(:log_response,  | 
| 55 | 
            +
                @connection.send(:log_response, response)
         | 
| 51 56 | 
             
                assert_match /response is filtered/, @connection.logger.log
         | 
| 52 57 | 
             
              end
         | 
| 53 58 | 
             
            end
         | 
| 54 59 |  | 
| 55 60 | 
             
            class TestConnection < Test::Unit::TestCase
         | 
| 61 | 
            +
             | 
| 56 62 | 
             
              def setup
         | 
| 57 63 | 
             
                @connection = Network::Connection.new("http://example.com/path")
         | 
| 58 64 | 
             
                @http = mock('http')
         | 
| @@ -65,14 +71,37 @@ class TestConnection < Test::Unit::TestCase | |
| 65 71 | 
             
                  { :class => Errno::ECONNABORTED,  :message => "The remote server reset the connection"},
         | 
| 66 72 | 
             
                  { :class => Errno::ECONNREFUSED,  :message => "The connection was refused by the remote server"},
         | 
| 67 73 | 
             
                ].each do |exception|
         | 
| 68 | 
            -
                  Net::HTTP.any_instance.expects(:request).raises exception[:class]
         | 
| 69 74 | 
             
                  e = assert_raise Network::Error do
         | 
| 70 | 
            -
                    @connection. | 
| 75 | 
            +
                    @connection.send(:try_request) do
         | 
| 76 | 
            +
                      raise exception[:class]
         | 
| 77 | 
            +
                    end
         | 
| 71 78 | 
             
                  end
         | 
| 72 79 | 
             
                  assert_equal exception[:message], e.message
         | 
| 73 80 | 
             
                end
         | 
| 74 81 | 
             
              end
         | 
| 75 82 |  | 
| 83 | 
            +
              def test_post_methods
         | 
| 84 | 
            +
                sec = sequence('order')
         | 
| 85 | 
            +
                @connection.expects(:log_request).in_sequence(sec)
         | 
| 86 | 
            +
                @connection.expects(:http).in_sequence(sec).returns(stub('http', :post => true))
         | 
| 87 | 
            +
                @connection.expects(:log_response).in_sequence(sec)
         | 
| 88 | 
            +
                @connection.expects(:handle_response).in_sequence(sec)
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                @connection.post("hello")
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              def test_response_handler_raises_response_error_if_response_code_not_in_200_299
         | 
| 94 | 
            +
                [300, 400, 500].each do |code|
         | 
| 95 | 
            +
                  assert_raise Network::ResponseError do
         | 
| 96 | 
            +
                    @connection.send(:handle_response, ResponseStub.new(code))
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
              end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
              def test_response_handler_returns_response_body_if_response_code_200_299
         | 
| 102 | 
            +
                assert_equal "response", @connection.send(:handle_response, ResponseStub.new(200, "OK", "response"))
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
             | 
| 76 105 | 
             
              def test_default_timeouts
         | 
| 77 106 | 
             
                assert_equal Network::Connection::READ_TIMEOUT, @connection.read_timeout
         | 
| 78 107 | 
             
                assert_equal Network::Connection::OPEN_TIMEOUT, @connection.open_timeout
         | 
| @@ -86,24 +115,21 @@ class TestConnection < Test::Unit::TestCase | |
| 86 115 | 
             
              end
         | 
| 87 116 |  | 
| 88 117 | 
             
              def test_default_headers_for_post_request
         | 
| 89 | 
            -
                 | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
                @connection. | 
| 118 | 
            +
                expected_headers = { 'Content-Type'   => 'application/x-www-form-urlencoded',
         | 
| 119 | 
            +
                                     'Content-Length' => '4' }
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                assert_equal expected_headers, @connection.send(:post_headers, "data")
         | 
| 93 122 | 
             
              end
         | 
| 94 123 |  | 
| 95 124 | 
             
              def test_user_headers_are_not_overwrited_by_default_headers
         | 
| 96 | 
            -
                 | 
| 97 | 
            -
             | 
| 98 | 
            -
                  'Accept'       => 'text/plain'
         | 
| 99 | 
            -
                }
         | 
| 125 | 
            +
                user_headers = { 'Content-Type' => 'application/xml', 
         | 
| 126 | 
            +
                                 'Accept'       => 'text/plain' }
         | 
| 100 127 |  | 
| 101 | 
            -
                 | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 128 | 
            +
                expected_headers = { 'Content-Length' => '4' }.update(user_headers)
         | 
| 129 | 
            +
                
         | 
| 130 | 
            +
                @connection.headers = user_headers
         | 
| 104 131 |  | 
| 105 | 
            -
                @connection. | 
| 106 | 
            -
                @connection.post("data")
         | 
| 132 | 
            +
                assert_equal expected_headers, @connection.send(:post_headers, "data")
         | 
| 107 133 | 
             
              end
         | 
| 108 134 |  | 
| 109 135 | 
             
              def test_configure_ssl_if_scheme_is_https
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: alovak-network
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 1.1. | 
| 4 | 
            +
              version: 1.1.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Pavel Gabriel
         | 
| @@ -43,7 +43,6 @@ extra_rdoc_files: [] | |
| 43 43 | 
             
            files: 
         | 
| 44 44 | 
             
            - lib/network/connection.rb
         | 
| 45 45 | 
             
            - lib/network.rb
         | 
| 46 | 
            -
            - test/network/test_connection.rb
         | 
| 47 46 | 
             
            has_rdoc: false
         | 
| 48 47 | 
             
            homepage: http://github.com/alovak/network/
         | 
| 49 48 | 
             
            licenses: 
         | 
| @@ -73,4 +72,5 @@ specification_version: 2 | |
| 73 72 | 
             
            summary: HTTP/HTTPS communication module based on ruby net/http, net/https modules
         | 
| 74 73 | 
             
            test_files: 
         | 
| 75 74 | 
             
            - test/network/test_network.rb
         | 
| 75 | 
            +
            - test/network/test_connection.rb
         | 
| 76 76 | 
             
            - test/test_helper.rb
         |