diff options
author | gunsch@chromium.org <gunsch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-20 21:51:44 +0000 |
---|---|---|
committer | gunsch@chromium.org <gunsch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-20 21:51:44 +0000 |
commit | 0cbc29bd2b89d1cfd81ef075860e8383c62a4bf4 (patch) | |
tree | e8c4f209f601459f24978463fc2a1232d07a56cc /net | |
parent | c5f45ba321f8103c3ff4d6f1c6bbda5e7191be9e (diff) | |
download | chromium_src-0cbc29bd2b89d1cfd81ef075860e8383c62a4bf4.zip chromium_src-0cbc29bd2b89d1cfd81ef075860e8383c62a4bf4.tar.gz chromium_src-0cbc29bd2b89d1cfd81ef075860e8383c62a4bf4.tar.bz2 |
Gets the peer address (if available) in server requests.
R=byungchul@chromium.org, lcwu@chromium.org, pfeldman@chromium.org, rsleevi@chromium.org
BUG=347770
Review URL: https://codereview.chromium.org/181063006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258424 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/server/http_server.cc | 3 | ||||
-rw-r--r-- | net/server/http_server_request_info.h | 5 | ||||
-rw-r--r-- | net/server/http_server_unittest.cc | 1 | ||||
-rw-r--r-- | net/socket/stream_listen_socket.cc | 17 | ||||
-rw-r--r-- | net/socket/stream_listen_socket.h | 2 |
5 files changed, 28 insertions, 0 deletions
diff --git a/net/server/http_server.cc b/net/server/http_server.cc index b8e300f..85797b9 100644 --- a/net/server/http_server.cc +++ b/net/server/http_server.cc @@ -132,6 +132,9 @@ void HttpServer::DidRead(StreamListenSocket* socket, if (!ParseHeaders(connection, &request, &pos)) break; + // Sets peer address if exists. + socket->GetPeerAddress(&request.peer); + std::string connection_header = request.GetHeaderValue("connection"); if (connection_header == "Upgrade") { connection->web_socket_.reset(WebSocket::CreateWebSocket(connection, diff --git a/net/server/http_server_request_info.h b/net/server/http_server_request_info.h index 6282418..183da1c 100644 --- a/net/server/http_server_request_info.h +++ b/net/server/http_server_request_info.h @@ -8,6 +8,8 @@ #include <map> #include <string> +#include "net/base/ip_endpoint.h" + namespace net { // Meta information about an HTTP request. @@ -23,6 +25,9 @@ class HttpServerRequestInfo { // lower case. std::string GetHeaderValue(const std::string& header_name) const; + // Request peer address. + IPEndPoint peer; + // Request method. std::string method; diff --git a/net/server/http_server_unittest.cc b/net/server/http_server_unittest.cc index 0c3c97f..1de2100 100644 --- a/net/server/http_server_unittest.cc +++ b/net/server/http_server_unittest.cc @@ -176,6 +176,7 @@ TEST_F(HttpServerTest, Request) { ASSERT_EQ("/test", requests_[0].path); ASSERT_EQ("", requests_[0].data); ASSERT_EQ(0u, requests_[0].headers.size()); + ASSERT_TRUE(StartsWithASCII(requests_[0].peer.ToString(), "127.0.0.1", true)); } TEST_F(HttpServerTest, RequestWithHeaders) { diff --git a/net/socket/stream_listen_socket.cc b/net/socket/stream_listen_socket.cc index 960991b..e5232af 100644 --- a/net/socket/stream_listen_socket.cc +++ b/net/socket/stream_listen_socket.cc @@ -100,6 +100,23 @@ int StreamListenSocket::GetLocalAddress(IPEndPoint* address) { return OK; } +int StreamListenSocket::GetPeerAddress(IPEndPoint* address) { + SockaddrStorage storage; + if (getpeername(socket_, storage.addr, &storage.addr_len)) { +#if defined(OS_WIN) + int err = WSAGetLastError(); +#else + int err = errno; +#endif + return MapSystemError(err); + } + + if (!address->FromSockAddr(storage.addr, storage.addr_len)) + return ERR_ADDRESS_INVALID; + + return OK; +} + SocketDescriptor StreamListenSocket::AcceptSocket() { SocketDescriptor conn = HANDLE_EINTR(accept(socket_, NULL, NULL)); if (conn == kInvalidSocket) diff --git a/net/socket/stream_listen_socket.h b/net/socket/stream_listen_socket.h index 3c9b984..90b5450 100644 --- a/net/socket/stream_listen_socket.h +++ b/net/socket/stream_listen_socket.h @@ -73,6 +73,8 @@ class NET_EXPORT StreamListenSocket // Copies the local address to |address|. Returns a network error code. int GetLocalAddress(IPEndPoint* address); + // Copies the peer address to |address|. Returns a network error code. + int GetPeerAddress(IPEndPoint* address); static const int kSocketError; |