1. diff --git a/src/http/client/client.cr b/src/http/client/client.cr
  2. index 605dc66..608ee81 100644
  3. --- a/src/http/client/client.cr
  4. +++ b/src/http/client/client.cr
  5. @@ -34,12 +34,12 @@ class HTTP::Client
  6. end
  7. {% for method in %w(get post put head delete patch) %}
  8. - def {{method.id}}(path, headers = nil, body = nil)
  9. - exec {{method.upcase}}, path, headers, body
  10. + def {{method.id}}(path, headers = nil, body = nil, src = nil, dst = nil
  11. + exec {{method.upcase}}, path, headers, body, src, dst
  12. end
  13. - def self.{{method.id}}(url, headers = nil, body = nil)
  14. - exec {{method.upcase}}, url, headers, body
  15. + def self.{{method.id}}(url, headers = nil, body = nil, src = nil, dst = nil
  16. + exec {{method.upcase}}, url, headers, body, src, dst
  17. end
  18. {% end %}
  19. @@ -64,8 +64,8 @@ class HTTP::Client
  20. HTTP::Response.from_io(socket)
  21. end
  22. - def exec(method : String, path, headers = nil, body = nil)
  23. - exec new_request method, path, headers, body
  24. + def exec(method : String, path, headers = nil, body = nil, src = nil, dst = nil
  25. + exec new_request method, path, headers, body, src, dst
  26. end
  27. def close
  28. @@ -76,10 +76,10 @@ class HTTP::Client
  29. @socket = nil
  30. end
  31. - private def new_request(method, path, headers, body)
  32. + private def new_request(method, path, headers, body, src, dst)
  33. headers ||= HTTP::Headers.new
  34. headers["Host"] ||= host_header
  35. - request = HTTP::Request.new method, path, headers, body
  36. + request = HTTP::Request.new method, path, headers, body, src, dst
  37. @before_request.try &.call(request)
  38. request
  39. end
  40. @@ -107,9 +107,9 @@ class HTTP::Client
  41. end
  42. end
  43. - def self.exec(method, url, headers = nil, body = nil)
  44. + def self.exec(method, url, headers = nil, body = nil, src = nil, dst = nil
  45. exec(url) do |client, path|
  46. - client.exec method, path, headers, body
  47. + client.exec method, path, headers, body, src, dst
  48. end
  49. end
  50. diff --git a/src/http/request.cr b/src/http/request.cr
  51. index 2fb7a04..0a25c43 100644
  52. --- a/src/http/request.cr
  53. +++ b/src/http/request.cr
  54. @@ -7,8 +7,11 @@ class HTTP::Request
  55. getter headers
  56. getter body
  57. getter version
  58. + getter src
  59. + getter dst
  60. - def initialize(@method : String, @path, @headers = Headers.new : Headers, @body = nil, @version = "HTTP/1.1")
  61. + def initialize(@method : String, @path, @headers = Headers.new : Headers, @body = nil, @version = "HTTP/1.1",
  62. + @src = nil, @dst = nil)
  63. if body = @body
  64. @headers["Content-Length"] = body.bytesize.to_s
  65. elsif @method == "POST" || @method == "PUT"
  66. @@ -42,12 +45,14 @@ class HTTP::Request
  67. end
  68. def self.from_io(io)
  69. + src = io.peeraddr
  70. + dst = io.addr
  71. request_line = io.gets.not_nil!
  72. request_line =~ /\A(\w+)\s([^\s]+)\s(HTTP\/\d\.\d)\r?\n\Z/
  73. method, path, http_version = $1, $2, $3
  74. HTTP.parse_headers_and_body(io) do |headers, body|
  75. - return new method, path, headers, body, http_version
  76. + return new method, path, headers, body, http_version, src, dst
  77. end
  78. raise "unexpected end of http request"