webservd: Export source address of http request

Source address of http request is not exported as part of request
headers. Enhanced webservd to export source IP address as part of
request headers.

BUG=b:37157996
TEST=Verified source IP address of the request is part of request
headers.

Change-Id: Icc343d4b3e34fbff096e4566f1710e1c9e79becf
Reviewed-on: https://chromium-review.googlesource.com/609822
Commit-Ready: Reddeiah Raju Konduru <raju.konduru@globaledgesoft.com>
Tested-by: Reddeiah Raju Konduru <raju.konduru@globaledgesoft.com>
Reviewed-by: Kishan Kunduru <kkunduru@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/webservd/dbus_request_handler.cc b/webservd/dbus_request_handler.cc
index 277d651..f9362c2 100644
--- a/webservd/dbus_request_handler.cc
+++ b/webservd/dbus_request_handler.cc
@@ -50,10 +50,12 @@
       handler_proxy_{handler_proxy} {
 }
 
-void DBusRequestHandler::HandleRequest(Request* request) {
+void DBusRequestHandler::HandleRequest(Request* request,
+                                       const std::string& src) {
   std::vector<std::tuple<std::string, std::string>> headers;
   for (const auto& pair : request->GetHeaders())
     headers.emplace_back(pair.first, pair.second);
+  headers.emplace_back("Source-Host", src);
 
   std::vector<std::tuple<int32_t, std::string, std::string, std::string,
                          std::string>> files;
diff --git a/webservd/dbus_request_handler.h b/webservd/dbus_request_handler.h
index 3171f8a..f90e40b 100644
--- a/webservd/dbus_request_handler.h
+++ b/webservd/dbus_request_handler.h
@@ -36,7 +36,7 @@
 
   // Called to process an incoming HTTP request this handler is subscribed
   // to handle.
-  void HandleRequest(Request* request) override;
+  void HandleRequest(Request* request, const std::string& src) override;
 
  private:
   Server* server_{nullptr};
diff --git a/webservd/request.cc b/webservd/request.cc
index 27e0b69..bd04d26 100644
--- a/webservd/request.cc
+++ b/webservd/request.cc
@@ -14,7 +14,9 @@
 
 #include "webservd/request.h"
 
+#include <arpa/inet.h>
 #include <microhttpd.h>
+#include <netinet/in.h>
 
 #include <base/bind.h>
 #include <base/files/file.h>
@@ -251,8 +253,16 @@
     protocol_handler_->AddRequest(this);
     auto p = protocol_handler_->request_handlers_.find(request_handler_id_);
     CHECK(p != protocol_handler_->request_handlers_.end());
+    const MHD_ConnectionInfo* info = MHD_get_connection_info(
+        connection_, MHD_CONNECTION_INFO_CLIENT_ADDRESS);
+    struct sockaddr_in6 *sock_addr;
+    char src[INET6_ADDRSTRLEN] = {};
+    if (info) {
+      sock_addr = reinterpret_cast<struct sockaddr_in6 *>(info->client_addr);
+      inet_ntop(AF_INET6,&sock_addr->sin6_addr, src, INET6_ADDRSTRLEN);
+    }
     // Send the request over D-Bus and await the response.
-    p->second.handler->HandleRequest(this);
+    p->second.handler->HandleRequest(this, src);
   } else {
     // There was no handler found when request was made, respond with
     // 404 Page Not Found.
diff --git a/webservd/request_handler_interface.h b/webservd/request_handler_interface.h
index fb3a25c..fae5fa2 100644
--- a/webservd/request_handler_interface.h
+++ b/webservd/request_handler_interface.h
@@ -30,7 +30,7 @@
   RequestHandlerInterface() = default;
   virtual ~RequestHandlerInterface() = default;
 
-  virtual void HandleRequest(Request* request) = 0;
+  virtual void HandleRequest(Request* request, const std::string& src) = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(RequestHandlerInterface);