summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorgunsch@chromium.org <gunsch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 21:51:44 +0000
committergunsch@chromium.org <gunsch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-20 21:51:44 +0000
commit0cbc29bd2b89d1cfd81ef075860e8383c62a4bf4 (patch)
treee8c4f209f601459f24978463fc2a1232d07a56cc /net
parentc5f45ba321f8103c3ff4d6f1c6bbda5e7191be9e (diff)
downloadchromium_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.cc3
-rw-r--r--net/server/http_server_request_info.h5
-rw-r--r--net/server/http_server_unittest.cc1
-rw-r--r--net/socket/stream_listen_socket.cc17
-rw-r--r--net/socket/stream_listen_socket.h2
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;