shill: Remove HTTPProxy

This code has been unused for a long time.

BUG=chromium:649417
TEST=shill unit tests

Change-Id: I7d7bdebda771f432543f6dee4ade4b9fc3fcfd9a
Reviewed-on: https://chromium-review.googlesource.com/398300
Commit-Ready: Eric Caruso <ejcaruso@chromium.org>
Tested-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Kirtika Ruchandani <kirtika@chromium.org>
Reviewed-by: Kevin Cernekee <cernekee@chromium.org>
diff --git a/Android.mk b/Android.mk
index 458c50d..0f7ebc6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -229,7 +229,6 @@
     file_reader.cc \
     geolocation_info.cc \
     hook_table.cc \
-    http_proxy.cc \
     http_request.cc \
     http_url.cc \
     icmp.cc \
@@ -451,7 +450,6 @@
     fake_store.cc \
     file_reader_unittest.cc \
     hook_table_unittest.cc \
-    http_proxy_unittest.cc \
     http_request_unittest.cc \
     http_url_unittest.cc \
     icmp_unittest.cc \
diff --git a/device.cc b/device.cc
index 45564c2..4641dad 100644
--- a/device.cc
+++ b/device.cc
@@ -53,7 +53,6 @@
 #include "shill/error.h"
 #include "shill/event_dispatcher.h"
 #include "shill/geolocation_info.h"
-#include "shill/http_proxy.h"
 #include "shill/icmp.h"
 #include "shill/ip_address_store.h"
 #include "shill/link_monitor.h"
diff --git a/http_proxy.cc b/http_proxy.cc
deleted file mode 100644
index 7baeb16..0000000
--- a/http_proxy.cc
+++ /dev/null
@@ -1,734 +0,0 @@
-//
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/http_proxy.h"
-
-#include <errno.h>
-#include <netinet/in.h>
-#include <linux/if.h>  // NOLINT - Needs definitions from netinet/in.h
-#include <stdio.h>
-#include <time.h>
-
-#include <string>
-#include <vector>
-
-#include <base/bind.h>
-#include <base/strings/string_number_conversions.h>
-#include <base/strings/string_split.h>
-#include <base/strings/string_util.h>
-#include <base/strings/stringprintf.h>
-
-#include "shill/async_connection.h"
-#include "shill/connection.h"
-#include "shill/dns_client.h"
-#include "shill/event_dispatcher.h"
-#include "shill/logging.h"
-#include "shill/net/ip_address.h"
-#include "shill/net/sockets.h"
-
-using base::Bind;
-using base::StringPrintf;
-using std::string;
-using std::vector;
-
-namespace shill {
-
-namespace Logging {
-static auto kModuleLogScope = ScopeLogger::kHTTPProxy;
-static string ObjectID(Connection* c) {
-  return c->interface_name();
-}
-}
-
-const int HTTPProxy::kClientHeaderTimeoutSeconds = 1;
-const int HTTPProxy::kConnectTimeoutSeconds = 10;
-const int HTTPProxy::kDNSTimeoutSeconds = 5;
-const int HTTPProxy::kDefaultServerPort = 80;
-const int HTTPProxy::kInputTimeoutSeconds = 30;
-const size_t HTTPProxy::kMaxClientQueue = 10;
-const size_t HTTPProxy::kMaxHeaderCount = 128;
-const size_t HTTPProxy::kMaxHeaderSize = 2048;
-const int HTTPProxy::kTransactionTimeoutSeconds = 600;
-
-const char HTTPProxy::kHTTPMethodConnect[] = "connect";
-const char HTTPProxy::kHTTPMethodTerminator[] = " ";
-const char HTTPProxy::kHTTPURLDelimiters[] = " /#?";
-const char HTTPProxy::kHTTPURLPrefix[] = "http://";
-const char HTTPProxy::kHTTPVersionPrefix[] = " HTTP/1";
-const char HTTPProxy::kInternalErrorMsg[] = "Proxy Failed: Internal Error";
-
-HTTPProxy::HTTPProxy(ConnectionRefPtr connection)
-    : state_(kStateIdle),
-      connection_(connection),
-      weak_ptr_factory_(this),
-      accept_callback_(Bind(&HTTPProxy::AcceptClient,
-                            weak_ptr_factory_.GetWeakPtr())),
-      connect_completion_callback_(Bind(&HTTPProxy::OnConnectCompletion,
-                                        weak_ptr_factory_.GetWeakPtr())),
-      dns_client_callback_(Bind(&HTTPProxy::GetDNSResult,
-                                weak_ptr_factory_.GetWeakPtr())),
-      read_client_callback_(Bind(&HTTPProxy::ReadFromClient,
-                                 weak_ptr_factory_.GetWeakPtr())),
-      read_server_callback_(Bind(&HTTPProxy::ReadFromServer,
-                                 weak_ptr_factory_.GetWeakPtr())),
-      write_client_callback_(Bind(&HTTPProxy::WriteToClient,
-                                  weak_ptr_factory_.GetWeakPtr())),
-      write_server_callback_(Bind(&HTTPProxy::WriteToServer,
-                                  weak_ptr_factory_.GetWeakPtr())),
-      dispatcher_(nullptr),
-      proxy_port_(-1),
-      proxy_socket_(-1),
-      sockets_(nullptr),
-      client_socket_(-1),
-      server_port_(kDefaultServerPort),
-      server_socket_(-1),
-      is_route_requested_(false) { }
-
-HTTPProxy::~HTTPProxy() {
-  Stop();
-}
-
-bool HTTPProxy::Start(EventDispatcher* dispatcher,
-                      Sockets* sockets) {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-
-  if (sockets_) {
-    // We are already running.
-    return true;
-  }
-
-  proxy_socket_ = sockets->Socket(PF_INET, SOCK_STREAM, 0);
-  if (proxy_socket_ < 0) {
-    PLOG(ERROR) << "Failed to open proxy socket";
-    return false;
-  }
-
-  struct sockaddr_in addr;
-  socklen_t addrlen = sizeof(addr);
-  memset(&addr, 0, sizeof(addr));
-  addr.sin_family = AF_INET;
-  addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-  if (sockets->Bind(proxy_socket_,
-                    reinterpret_cast<struct sockaddr*>(&addr),
-                    sizeof(addr)) < 0 ||
-      sockets->GetSockName(proxy_socket_,
-                           reinterpret_cast<struct sockaddr*>(&addr),
-                           &addrlen) < 0 ||
-      sockets->SetNonBlocking(proxy_socket_) < 0 ||
-      sockets->Listen(proxy_socket_, kMaxClientQueue) < 0) {
-    sockets->Close(proxy_socket_);
-    proxy_socket_ = -1;
-    PLOG(ERROR) << "HTTPProxy socket setup failed";
-    return false;
-  }
-
-  accept_handler_.reset(
-      dispatcher->CreateReadyHandler(proxy_socket_, IOHandler::kModeInput,
-                                     accept_callback_));
-  dispatcher_ = dispatcher;
-  dns_client_.reset(new DNSClient(IPAddress::kFamilyIPv4,
-                                  connection_->interface_name(),
-                                  connection_->dns_servers(),
-                                  kDNSTimeoutSeconds * 1000,
-                                  dispatcher,
-                                  dns_client_callback_));
-  proxy_port_ = ntohs(addr.sin_port);
-  server_async_connection_.reset(
-      new AsyncConnection(connection_->interface_name(), dispatcher, sockets,
-                          connect_completion_callback_));
-  sockets_ = sockets;
-  state_ = kStateWaitConnection;
-  return true;
-}
-
-void HTTPProxy::Stop() {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-
-  if (!sockets_) {
-    return;
-  }
-
-  StopClient();
-
-  accept_handler_.reset();
-  dispatcher_ = nullptr;
-  dns_client_.reset();
-  proxy_port_ = -1;
-  server_async_connection_.reset();
-  sockets_->Close(proxy_socket_);
-  proxy_socket_ = -1;
-  sockets_ = nullptr;
-  state_ = kStateIdle;
-}
-
-// IOReadyHandler callback routine fired when a client connects to the
-// proxy's socket.  We Accept() the client and start reading a request
-// from it.
-void HTTPProxy::AcceptClient(int fd) {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-
-  int client_fd = sockets_->Accept(fd, nullptr, nullptr);
-  if (client_fd < 0) {
-    PLOG(ERROR) << "Client accept failed";
-    return;
-  }
-
-  accept_handler_->Stop();
-
-  client_socket_ = client_fd;
-
-  sockets_->SetNonBlocking(client_socket_);
-  read_client_handler_.reset(dispatcher_->CreateInputHandler(
-      client_socket_,
-      read_client_callback_,
-      Bind(&HTTPProxy::OnReadError, weak_ptr_factory_.GetWeakPtr())));
-  // Overall transaction timeout.
-  transaction_timeout_.Reset(Bind(&HTTPProxy::StopClient,
-                                  weak_ptr_factory_.GetWeakPtr()));
-  dispatcher_->PostDelayedTask(transaction_timeout_.callback(),
-                               kTransactionTimeoutSeconds * 1000);
-
-  state_ = kStateReadClientHeader;
-  StartIdleTimeout();
-}
-
-bool HTTPProxy::ConnectServer(const IPAddress& address, int port) {
-  state_ = kStateConnectServer;
-  if (!server_async_connection_->Start(address, port)) {
-    SendClientError(500, "Could not create socket to connect to server");
-    return false;
-  }
-  StartIdleTimeout();
-  return true;
-}
-
-// DNSClient callback that fires when the DNS request completes.
-void HTTPProxy::GetDNSResult(const Error& error, const IPAddress& address) {
-  if (!error.IsSuccess()) {
-    SendClientError(502, string("Could not resolve hostname: ") +
-                    error.message());
-    return;
-  }
-  ConnectServer(address, server_port_);
-}
-
-// IOReadyHandler callback routine which fires when the asynchronous Connect()
-// to the remote server completes (or fails).
-void HTTPProxy::OnConnectCompletion(bool success, int fd) {
-  if (!success) {
-    SendClientError(500, string("Socket connection delayed failure: ") +
-                    server_async_connection_->error());
-    return;
-  }
-  server_socket_ = fd;
-  state_ = kStateTunnelData;
-
-  // If this was a "CONNECT" request, notify the client that the connection
-  // has been established by sending an "OK" response.
-  if (base::LowerCaseEqualsASCII(client_method_, kHTTPMethodConnect)) {
-    SetClientResponse(200, "OK", "", "");
-    StartReceive();
-  }
-
-  StartTransmit();
-}
-
-void HTTPProxy::OnReadError(const string& error_msg) {
-  StopClient();
-}
-
-// Read through the header lines from the client, modifying or adding
-// lines as necessary.  Perform final determination of the hostname/port
-// we should connect to and either start a DNS request or connect to a
-// numeric address.
-bool HTTPProxy::ParseClientRequest() {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-
-  string host;
-  bool found_via = false;
-  bool found_connection = false;
-  for (auto& header : client_headers_) {
-    if (base::StartsWith(header, "Host:",
-                         base::CompareCase::INSENSITIVE_ASCII)) {
-      host = header.substr(5);
-    } else if (base::StartsWith(header, "Via:",
-                                base::CompareCase::INSENSITIVE_ASCII)) {
-      found_via = true;
-      header.append(StringPrintf(", %s shill-proxy", client_version_.c_str()));
-    } else if (base::StartsWith(header, "Connection:",
-                                base::CompareCase::INSENSITIVE_ASCII)) {
-      found_connection = true;
-      header.assign("Connection: close");
-    } else if (base::StartsWith(header, "Proxy-Connection:",
-                                base::CompareCase::INSENSITIVE_ASCII)) {
-      header.assign("Proxy-Connection: close");
-    }
-  }
-
-  if (!found_connection) {
-    client_headers_.push_back("Connection: close");
-  }
-  if (!found_via) {
-    client_headers_.push_back(
-        StringPrintf("Via: %s shill-proxy", client_version_.c_str()));
-  }
-
-  // Assemble the request as it will be sent to the server.
-  client_data_.Clear();
-  if (!base::LowerCaseEqualsASCII(client_method_, kHTTPMethodConnect)) {
-    for (const auto& header : client_headers_) {
-      client_data_.Append(ByteString(header + "\r\n", false));
-    }
-    client_data_.Append(ByteString(string("\r\n"), false));
-  }
-
-  base::TrimWhitespaceASCII(host, base::TRIM_ALL, &host);
-  if (host.empty()) {
-    // Revert to using the hostname in the URL if no "Host:" header exists.
-    host = server_hostname_;
-  }
-
-  if (host.empty()) {
-    SendClientError(400, "I don't know what host you want me to connect to");
-    return false;
-  }
-
-  server_port_ = 80;
-  vector<string> host_parts = base::SplitString(
-      host, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-
-  if (host_parts.size() > 2) {
-    SendClientError(400, "Too many colons in hostname");
-    return false;
-  } else if (host_parts.size() == 2) {
-    server_hostname_ = host_parts[0];
-    if (!base::StringToInt(host_parts[1], &server_port_)) {
-      SendClientError(400, "Could not parse port number");
-      return false;
-    }
-  } else {
-    server_hostname_ = host;
-  }
-
-  connection_->RequestRouting();
-  is_route_requested_ = true;
-
-  IPAddress addr(IPAddress::kFamilyIPv4);
-  if (addr.SetAddressFromString(server_hostname_)) {
-    if (!ConnectServer(addr, server_port_)) {
-      return false;
-    }
-  } else {
-    SLOG(connection_.get(), 3) << "Looking up host: " << server_hostname_;
-    Error error;
-    if (!dns_client_->Start(server_hostname_, &error)) {
-      SendClientError(502, "Could not resolve hostname: " + error.message());
-      return false;
-    }
-    state_ = kStateLookupServer;
-  }
-  return true;
-}
-
-// Accept a new line into the client headers.  Returns false if a parse
-// error occurs.
-bool HTTPProxy::ProcessLastHeaderLine() {
-  string* header = &client_headers_.back();
-  base::TrimString(*header, "\r", header);
-
-  if (header->empty()) {
-    // Empty line terminates client headers.
-    client_headers_.pop_back();
-    if (!ParseClientRequest()) {
-      return false;
-    }
-  }
-
-  // Is this is the first header line?
-  if (client_headers_.size() == 1) {
-    if (!ReadClientHTTPMethod(header) ||
-        !ReadClientHTTPVersion(header) ||
-        !ReadClientHostname(header)) {
-      return false;
-    }
-  }
-
-  if (client_headers_.size() >= kMaxHeaderCount) {
-    SendClientError(500, kInternalErrorMsg);
-    return false;
-  }
-
-  return true;
-}
-
-// Split input from client into header lines, and consume parsed lines
-// from InputData.  The passed in |data| is modified to indicate the
-// characters consumed.
-bool HTTPProxy::ReadClientHeaders(InputData* data) {
-  unsigned char* ptr = data->buf;
-  unsigned char* end = ptr + data->len;
-
-  if (client_headers_.empty()) {
-    client_headers_.push_back(string());
-  }
-
-  for (; ptr < end && state_ == kStateReadClientHeader; ++ptr) {
-    if (*ptr == '\n') {
-      if (!ProcessLastHeaderLine()) {
-        return false;
-      }
-
-      // Start a new line.  New chararacters we receive will be appended there.
-      client_headers_.push_back(string());
-      continue;
-    }
-
-    string* header = &client_headers_.back();
-    // Is the first character of the header line a space or tab character?
-    if (header->empty() && (*ptr == ' ' || *ptr == '\t') &&
-        client_headers_.size() > 1) {
-      // Line Continuation: Add this character to the previous header line.
-      // This way, all of the data (including newlines and line continuation
-      // characters) related to a specific header will be contained within
-      // a single element of |client_headers_|, and manipulation of headers
-      // such as appending will be simpler.  This is accomplished by removing
-      // the empty line we started, and instead appending the whitespace
-      // and following characters to the previous line.
-      client_headers_.pop_back();
-      header = &client_headers_.back();
-      header->append("\r\n");
-    }
-
-    if (header->length() >= kMaxHeaderSize) {
-      SendClientError(500, kInternalErrorMsg);
-      return false;
-    }
-    header->push_back(*ptr);
-  }
-
-  // Return the remaining data to the caller -- this could be POST data
-  // or other non-header data sent with the client request.
-  data->buf = ptr;
-  data->len = end - ptr;
-
-  return true;
-}
-
-// Finds the URL in the first line of an HTTP client header, and extracts
-// and removes the hostname (and port) from the URL.  Returns false if a
-// parse error occurs, and true otherwise (whether or not the hostname was
-// found).
-bool HTTPProxy::ReadClientHostname(string* header) {
-  const string http_url_prefix(kHTTPURLPrefix);
-  size_t url_idx = header->find(http_url_prefix);
-  if (url_idx != string::npos) {
-    size_t host_start = url_idx + http_url_prefix.length();
-    size_t host_end =
-      header->find_first_of(kHTTPURLDelimiters, host_start);
-    if (host_end != string::npos) {
-      server_hostname_ = header->substr(host_start,
-                                        host_end - host_start);
-      // Modify the URL passed upstream to remove "http://<hostname>".
-      header->erase(url_idx, host_end - url_idx);
-      if ((*header)[url_idx] != '/') {
-        header->insert(url_idx, "/");
-      }
-    } else {
-      LOG(ERROR) << "Could not find end of hostname in request.  Line was: "
-                 << *header;
-      SendClientError(500, kInternalErrorMsg);
-      return false;
-    }
-  }
-  return true;
-}
-
-bool HTTPProxy::ReadClientHTTPMethod(string* header) {
-  size_t method_end = header->find(kHTTPMethodTerminator);
-  if (method_end == string::npos || method_end == 0) {
-    LOG(ERROR) << "Could not parse HTTP method.  Line was: " << *header;
-    SendClientError(501, "Server could not parse HTTP method");
-    return false;
-  }
-  client_method_ = header->substr(0, method_end);
-  return true;
-}
-
-// Extract the HTTP version number from the first line of the client headers.
-// Returns true if found.
-bool HTTPProxy::ReadClientHTTPVersion(string* header) {
-  const string http_version_prefix(kHTTPVersionPrefix);
-  size_t http_ver_pos = header->find(http_version_prefix);
-  if (http_ver_pos != string::npos) {
-    client_version_ =
-      header->substr(http_ver_pos + http_version_prefix.length() - 1);
-  } else {
-    SendClientError(501, "Server only accepts HTTP/1.x requests");
-    return false;
-  }
-  return true;
-}
-
-// IOInputHandler callback that fires when data is read from the client.
-// This could be header data, or perhaps POST data that follows the headers.
-void HTTPProxy::ReadFromClient(InputData* data) {
-  SLOG(connection_.get(), 3) << "In " << __func__ << " length " << data->len;
-
-  if (data->len < 0) {
-    // Read error from client, error callback has already stopped the client.
-    return;
-  }
-
-  if (data->len == 0) {
-    // EOF from client.
-    StopClient();
-    return;
-  }
-
-  if (state_ == kStateReadClientHeader) {
-    if (!ReadClientHeaders(data)) {
-      return;
-    }
-    if (state_ == kStateReadClientHeader) {
-      // Still consuming client headers; restart the input timer.
-      StartIdleTimeout();
-      return;
-    }
-  }
-
-  // Check data->len again since ReadClientHeaders() may have consumed some
-  // part of it.
-  if (data->len != 0) {
-    // The client sent some information after its headers.  Buffer the client
-    // input and temporarily disable input events from the client.
-    client_data_.Append(ByteString(data->buf, data->len));
-    read_client_handler_->Stop();
-    StartTransmit();
-  }
-}
-
-// IOInputHandler callback which fires when data has been read from the
-// server.
-void HTTPProxy::ReadFromServer(InputData* data) {
-  SLOG(connection_.get(), 3) << "In " << __func__ << " length " << data->len;
-  if (data->len == 0) {
-    // Server closed connection.
-    if (server_data_.IsEmpty()) {
-      StopClient();
-      return;
-    }
-    state_ = kStateFlushResponse;
-  } else {
-    read_server_handler_->Stop();
-  }
-
-  server_data_.Append(ByteString(data->buf, data->len));
-
-  StartTransmit();
-}
-
-// Return an HTTP error message back to the client.
-void HTTPProxy::SendClientError(int code, const string& error) {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-  LOG(ERROR) << "Sending error " << error;
-  SetClientResponse(code, "ERROR", "text/plain", error);
-  state_ = kStateFlushResponse;
-  StartTransmit();
-}
-
-// Create an HTTP response message to be sent to the client.
-void HTTPProxy::SetClientResponse(int code, const string& type,
-                                  const string& content_type,
-                                  const string& message) {
-  string content_line;
-  if (!message.empty() && !content_type.empty()) {
-    content_line = StringPrintf("Content-Type: %s\r\n", content_type.c_str());
-  }
-  string response = StringPrintf("HTTP/1.1 %d %s\r\n"
-                                 "%s\r\n"
-                                 "%s", code, type.c_str(),
-                                 content_line.c_str(),
-                                 message.c_str());
-  server_data_ = ByteString(response, false);
-}
-
-// Start a timeout for "the next event".  This timeout augments the overall
-// transaction timeout to make sure there is some activity occurring at
-// reasonable intervals.
-void HTTPProxy::StartIdleTimeout() {
-  int timeout_seconds = 0;
-  switch (state_) {
-    case kStateReadClientHeader:
-      timeout_seconds = kClientHeaderTimeoutSeconds;
-      break;
-    case kStateConnectServer:
-      timeout_seconds = kConnectTimeoutSeconds;
-      break;
-    case kStateLookupServer:
-      // DNSClient has its own internal timeout, so we need not set one here.
-      timeout_seconds = 0;
-      break;
-    default:
-      timeout_seconds = kInputTimeoutSeconds;
-      break;
-  }
-  idle_timeout_.Cancel();
-  if (timeout_seconds != 0) {
-    idle_timeout_.Reset(Bind(&HTTPProxy::StopClient,
-                             weak_ptr_factory_.GetWeakPtr()));
-    dispatcher_->PostDelayedTask(idle_timeout_.callback(),
-                                 timeout_seconds * 1000);
-  }
-}
-
-// Start the various input handlers.  Listen for new data only if we have
-// completely written the last data we've received to the other end.
-void HTTPProxy::StartReceive() {
-  if (state_ == kStateTunnelData && client_data_.IsEmpty()) {
-    read_client_handler_->Start();
-  }
-  if (server_data_.IsEmpty()) {
-    if (state_ == kStateTunnelData) {
-      if (read_server_handler_.get()) {
-        read_server_handler_->Start();
-      } else {
-        read_server_handler_.reset(dispatcher_->CreateInputHandler(
-            server_socket_,
-            read_server_callback_,
-            Bind(&HTTPProxy::OnReadError, weak_ptr_factory_.GetWeakPtr())));
-      }
-    } else if (state_ == kStateFlushResponse) {
-      StopClient();
-      return;
-    }
-  }
-  StartIdleTimeout();
-}
-
-// Start the various output-ready handlers for the endpoints we have
-// data waiting for.
-void HTTPProxy::StartTransmit() {
-  if (state_ == kStateTunnelData && !client_data_.IsEmpty()) {
-    if (write_server_handler_.get()) {
-      write_server_handler_->Start();
-    } else {
-      write_server_handler_.reset(
-          dispatcher_->CreateReadyHandler(server_socket_,
-                                          IOHandler::kModeOutput,
-                                          write_server_callback_));
-    }
-  }
-  if ((state_ == kStateFlushResponse || state_ == kStateTunnelData) &&
-      !server_data_.IsEmpty()) {
-    if (write_client_handler_.get()) {
-      write_client_handler_->Start();
-    } else {
-      write_client_handler_.reset(
-          dispatcher_->CreateReadyHandler(client_socket_,
-                                          IOHandler::kModeOutput,
-                                          write_client_callback_));
-    }
-  }
-  StartIdleTimeout();
-}
-
-// End the transaction with the current client, restart the IOHandler
-// which alerts us to new clients connecting.  This function is called
-// during various error conditions and is a callback for all timeouts.
-void HTTPProxy::StopClient() {
-  SLOG(connection_.get(), 3) << "In " << __func__;
-
-  if (is_route_requested_) {
-    connection_->ReleaseRouting();
-    is_route_requested_ = false;
-  }
-  write_client_handler_.reset();
-  read_client_handler_.reset();
-  if (client_socket_ != -1) {
-    sockets_->Close(client_socket_);
-    client_socket_ = -1;
-  }
-  client_headers_.clear();
-  client_method_.clear();
-  client_version_.clear();
-  server_port_ = kDefaultServerPort;
-  write_server_handler_.reset();
-  read_server_handler_.reset();
-  if (server_socket_ != -1) {
-    sockets_->Close(server_socket_);
-    server_socket_ = -1;
-  }
-  server_hostname_.clear();
-  client_data_.Clear();
-  server_data_.Clear();
-  dns_client_->Stop();
-  server_async_connection_->Stop();
-  idle_timeout_.Cancel();
-  transaction_timeout_.Cancel();
-  accept_handler_->Start();
-  state_ = kStateWaitConnection;
-}
-
-// Output ReadyHandler callback which fires when the client socket is
-// ready for data to be sent to it.
-void HTTPProxy::WriteToClient(int fd) {
-  CHECK_EQ(client_socket_, fd);
-  int ret = sockets_->Send(fd, server_data_.GetConstData(),
-                           server_data_.GetLength(), 0);
-  SLOG(connection_.get(), 3) << "In " << __func__ << " wrote " << ret << " of "
-                             << server_data_.GetLength();
-  if (ret < 0) {
-    LOG(ERROR) << "Server write failed";
-    StopClient();
-    return;
-  }
-
-  server_data_ = ByteString(server_data_.GetConstData() + ret,
-                            server_data_.GetLength() - ret);
-
-  if (server_data_.IsEmpty()) {
-    write_client_handler_->Stop();
-  }
-
-  StartReceive();
-}
-
-// Output ReadyHandler callback which fires when the server socket is
-// ready for data to be sent to it.
-void HTTPProxy::WriteToServer(int fd) {
-  CHECK_EQ(server_socket_, fd);
-  int ret = sockets_->Send(fd, client_data_.GetConstData(),
-                           client_data_.GetLength(), 0);
-  SLOG(connection_.get(), 3) << "In " << __func__ << " wrote " << ret << " of "
-                             << client_data_.GetLength();
-
-  if (ret < 0) {
-    LOG(ERROR) << "Client write failed";
-    StopClient();
-    return;
-  }
-
-  client_data_ = ByteString(client_data_.GetConstData() + ret,
-                            client_data_.GetLength() - ret);
-
-  if (client_data_.IsEmpty()) {
-    write_server_handler_->Stop();
-  }
-
-  StartReceive();
-}
-
-}  // namespace shill
diff --git a/http_proxy.h b/http_proxy.h
deleted file mode 100644
index b4132c6..0000000
--- a/http_proxy.h
+++ /dev/null
@@ -1,175 +0,0 @@
-//
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#ifndef SHILL_HTTP_PROXY_H_
-#define SHILL_HTTP_PROXY_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/cancelable_callback.h>
-#include <base/memory/ref_counted.h>
-#include <base/memory/weak_ptr.h>
-
-#include "shill/net/byte_string.h"
-#include "shill/refptr_types.h"
-
-namespace shill {
-
-class AsyncConnection;
-class DNSClient;
-class Error;
-class EventDispatcher;
-struct InputData;
-class IOHandler;
-class IPAddress;
-class Sockets;
-
-// The HTTPProxy class implements a simple web proxy that
-// is bound to a specific interface and name server.  This
-// allows us to specify which connection a URL should be
-// fetched through, even though many connections
-// could be active at the same time.
-//
-// This service is meant to be low-performance, since we
-// do not want to divert resources from the rest of the
-// connection manager.  As such, we serve one client request
-// at a time.  This is probably okay since the use case is
-// limited -- only portal detection, activation and Cashew
-// are planned to be full-time users.
-class HTTPProxy {
- public:
-  enum State {
-    kStateIdle,
-    kStateWaitConnection,
-    kStateReadClientHeader,
-    kStateLookupServer,
-    kStateConnectServer,
-    kStateTunnelData,
-    kStateFlushResponse,
-  };
-
-  explicit HTTPProxy(ConnectionRefPtr connection);
-  virtual ~HTTPProxy();
-
-  // Start HTTP proxy.
-  bool Start(EventDispatcher* dispatcher, Sockets* sockets);
-
-  // Shutdown.
-  void Stop();
-
-  int proxy_port() const { return proxy_port_; }
-
- private:
-  friend class HTTPProxyTest;
-
-  // Time to wait for initial headers from client.
-  static const int kClientHeaderTimeoutSeconds;
-  // Time to wait for connection to remote server.
-  static const int kConnectTimeoutSeconds;
-  // Time to wait for DNS server.
-  static const int kDNSTimeoutSeconds;
-  // Default port on remote server to connect to.
-  static const int kDefaultServerPort;
-  // Time to wait for any input from either server or client.
-  static const int kInputTimeoutSeconds;
-  // Maximum clients to be kept waiting.
-  static const size_t kMaxClientQueue;
-  // Maximum number of header lines to accept.
-  static const size_t kMaxHeaderCount;
-  // Maximum length of an individual header line.
-  static const size_t kMaxHeaderSize;
-  // Timeout for whole transaction.
-  static const int kTransactionTimeoutSeconds;
-
-  static const char kHTTPMethodConnect[];
-  static const char kHTTPMethodTerminator[];
-  static const char kHTTPURLDelimiters[];
-  static const char kHTTPURLPrefix[];
-  static const char kHTTPVersionPrefix[];
-  static const char kHTTPVersionErrorMsg[];
-  static const char kInternalErrorMsg[];  // Message to send on failure.
-
-  void AcceptClient(int fd);
-  bool ConnectServer(const IPAddress& address, int port);
-  void GetDNSResult(const Error& error, const IPAddress& address);
-  void OnReadError(const std::string& error_msg);
-  void OnConnectCompletion(bool success, int fd);
-  bool ParseClientRequest();
-  bool ProcessLastHeaderLine();
-  bool ReadClientHeaders(InputData* data);
-  bool ReadClientHostname(std::string* header);
-  bool ReadClientHTTPMethod(std::string* header);
-  bool ReadClientHTTPVersion(std::string* header);
-  void ReadFromClient(InputData* data);
-  void ReadFromServer(InputData* data);
-  void SetClientResponse(int code, const std::string& type,
-                         const std::string& content_type,
-                         const std::string& message);
-  void SendClientError(int code, const std::string& error);
-  void StartIdleTimeout();
-  void StartReceive();
-  void StartTransmit();
-  void StopClient();
-  void WriteToClient(int fd);
-  void WriteToServer(int fd);
-
-  // State held for the lifetime of the proxy.
-  State state_;
-  ConnectionRefPtr connection_;
-  base::WeakPtrFactory<HTTPProxy> weak_ptr_factory_;
-  base::Callback<void(int)> accept_callback_;
-  base::Callback<void(bool, int)> connect_completion_callback_;
-  base::Callback<void(const Error&, const IPAddress&)> dns_client_callback_;
-  base::Callback<void(InputData*)> read_client_callback_;
-  base::Callback<void(InputData*)> read_server_callback_;
-  base::Callback<void(int)> write_client_callback_;
-  base::Callback<void(int)> write_server_callback_;
-
-  // State held while proxy is started (even if no transaction is active).
-  std::unique_ptr<IOHandler> accept_handler_;
-  EventDispatcher* dispatcher_;
-  std::unique_ptr<DNSClient> dns_client_;
-  int proxy_port_;
-  int proxy_socket_;
-  std::unique_ptr<AsyncConnection> server_async_connection_;
-  Sockets* sockets_;
-
-  // State held while proxy is started and a transaction is active.
-  int client_socket_;
-  std::string client_method_;
-  std::string client_version_;
-  int server_port_;
-  int server_socket_;
-  bool is_route_requested_;
-  base::CancelableClosure idle_timeout_;
-  base::CancelableClosure transaction_timeout_;
-  std::vector<std::string> client_headers_;
-  std::string server_hostname_;
-  ByteString client_data_;
-  ByteString server_data_;
-  std::unique_ptr<IOHandler> read_client_handler_;
-  std::unique_ptr<IOHandler> write_client_handler_;
-  std::unique_ptr<IOHandler> read_server_handler_;
-  std::unique_ptr<IOHandler> write_server_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(HTTPProxy);
-};
-
-}  // namespace shill
-
-#endif  // SHILL_HTTP_PROXY_H_
diff --git a/http_proxy_unittest.cc b/http_proxy_unittest.cc
deleted file mode 100644
index 3457d4f..0000000
--- a/http_proxy_unittest.cc
+++ /dev/null
@@ -1,856 +0,0 @@
-//
-// Copyright (C) 2012 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/http_proxy.h"
-
-#include <netinet/in.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/strings/stringprintf.h>
-#include <gtest/gtest.h>
-
-#include "shill/mock_async_connection.h"
-#include "shill/mock_connection.h"
-#include "shill/mock_control.h"
-#include "shill/mock_device_info.h"
-#include "shill/mock_dns_client.h"
-#include "shill/mock_event_dispatcher.h"
-#include "shill/net/ip_address.h"
-#include "shill/net/mock_sockets.h"
-
-using base::StringPrintf;
-using std::string;
-using std::vector;
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::AtLeast;
-using ::testing::DoAll;
-using ::testing::Invoke;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::ReturnArg;
-using ::testing::ReturnNew;
-using ::testing::ReturnRef;
-using ::testing::SetArgumentPointee;
-using ::testing::StrEq;
-using ::testing::StrictMock;
-using ::testing::Test;
-
-namespace shill {
-
-namespace {
-const char kBadHeaderMissingURL[] = "BLAH\r\n";
-const char kBadHeaderMissingVersion[] = "BLAH http://hostname\r\n";
-const char kBadHostnameLine[] = "GET HTTP/1.1 http://hostname\r\n";
-const char kBasicGetHeader[] = "GET / HTTP/1.1\r\n";
-const char kBasicGetHeaderWithURL[] =
-    "GET http://www.chromium.org/ HTTP/1.1\r\n";
-const char kBasicGetHeaderWithURLNoTrailingSlash[] =
-    "GET http://www.chromium.org HTTP/1.1\r\n";
-const char kConnectQuery[] =
-    "CONNECT 10.10.10.10:443 HTTP/1.1\r\n"
-    "Host: 10.10.10.10:443\r\n\r\n";
-const char kQueryTemplate[] = "GET %s HTTP/%s\r\n%s"
-    "User-Agent: Mozilla/5.0 (X11; CrOS i686 1299.0.2011) "
-    "AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.936.0 Safari/535.8\r\n"
-    "Accept: text/html,application/xhtml+xml,application/xml;"
-    "q=0.9,*/*;q=0.8\r\n"
-    "Accept-Encoding: gzip,deflate,sdch\r\n"
-    "Accept-Language: en-US,en;q=0.8,ja;q=0.6\r\n"
-    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
-    "Cookie: PREF=ID=xxxxxxxxxxxxxxxx:U=xxxxxxxxxxxxxxxx:FF=0:"
-    "TM=1317340083:LM=1317390705:GM=1:S=_xxxxxxxxxxxxxxx; "
-    "NID=52=xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxx; "
-    "HSID=xxxxxxxxxxxx-xxxx; APISID=xxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxx; "
-    "SID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxx"
-    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxx"
-    "xxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxx"
-    "_xxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx-xx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-    "xxxxxxxxxxxxxxxx\r\n\r\n";
-const char kInterfaceName[] = "int0";
-const char kDNSServer0[] = "8.8.8.8";
-const char kDNSServer1[] = "8.8.4.4";
-const char kServerAddress[] = "10.10.10.10";
-const char* kDNSServers[] = { kDNSServer0, kDNSServer1 };
-const int kProxyFD = 10203;
-const int kServerFD = 10204;
-const int kClientFD = 10205;
-const int kServerPort = 40506;
-const int kConnectPort = 443;
-}  // namespace
-
-MATCHER_P(IsIPAddress, address, "") {
-  IPAddress ip_address(IPAddress::kFamilyIPv4);
-  EXPECT_TRUE(ip_address.SetAddressFromString(address));
-  return ip_address.Equals(arg);
-}
-
-MATCHER_P(CallbackEq, callback, "") {
-  return arg.Equals(callback);
-}
-
-class HTTPProxyTest : public Test {
- public:
-  HTTPProxyTest()
-      : interface_name_(kInterfaceName),
-        server_async_connection_(nullptr),
-        dns_servers_(kDNSServers, kDNSServers + 2),
-        dns_client_(nullptr),
-        device_info_(
-            new NiceMock<MockDeviceInfo>(&control_, nullptr, nullptr, nullptr)),
-        connection_(new StrictMock<MockConnection>(device_info_.get())),
-        proxy_(connection_) {}
-
- protected:
-  virtual void SetUp() {
-    EXPECT_CALL(*connection_.get(), interface_name())
-        .WillRepeatedly(ReturnRef(interface_name_));
-    EXPECT_CALL(*connection_.get(), dns_servers())
-        .WillRepeatedly(ReturnRef(dns_servers_));
-  }
-  virtual void TearDown() {
-    if (proxy_.sockets_) {
-      ExpectStop();
-    }
-    const int proxy_fds[] = {
-      proxy_.client_socket_,
-      proxy_.server_socket_,
-      proxy_.proxy_socket_
-    };
-    for (const int fd : proxy_fds) {
-      if (fd != -1) {
-        EXPECT_CALL(sockets_, Close(fd));
-      }
-    }
-  }
-  string CreateRequest(const string& url, const string& http_version,
-                       const string& extra_lines) {
-    string append_lines(extra_lines);
-    if (append_lines.size()) {
-      append_lines.append("\r\n");
-    }
-    return StringPrintf(kQueryTemplate, url.c_str(), http_version.c_str(),
-                        append_lines.c_str());
-  }
-  int InvokeGetSockName(int fd, struct sockaddr* addr_out,
-                        socklen_t* sockaddr_size) {
-    struct sockaddr_in addr;
-    EXPECT_EQ(kProxyFD, fd);
-    EXPECT_GE(sizeof(sockaddr_in), *sockaddr_size);
-    addr.sin_addr.s_addr = 0;
-    addr.sin_port = kServerPort;
-    memcpy(addr_out, &addr, sizeof(addr));
-    *sockaddr_size = sizeof(sockaddr_in);
-    return 0;
-  }
-  void  InvokeSyncConnect(const IPAddress& /*address*/, int /*port*/) {
-    proxy_.OnConnectCompletion(true, kServerFD);
-  }
-  size_t FindInRequest(const string& find_string) {
-    const ByteString& request_data = GetClientData();
-    string request_string(
-        reinterpret_cast<const char*>(request_data.GetConstData()),
-        request_data.GetLength());
-    return request_string.find(find_string);
-  }
-  // Accessors
-  const ByteString& GetClientData() {
-    return proxy_.client_data_;
-  }
-  HTTPProxy* proxy() { return &proxy_; }
-  HTTPProxy::State GetProxyState() {
-    return proxy_.state_;
-  }
-  const ByteString& GetServerData() {
-    return proxy_.server_data_;
-  }
-  MockSockets& sockets() { return sockets_; }
-  MockEventDispatcher& dispatcher() { return dispatcher_; }
-
-
-  // Expectations
-  void ExpectClientReset() {
-    EXPECT_EQ(-1, proxy_.client_socket_);
-    EXPECT_TRUE(proxy_.client_version_.empty());
-    EXPECT_EQ(HTTPProxy::kDefaultServerPort, proxy_.server_port_);
-    EXPECT_EQ(-1, proxy_.server_socket_);
-    EXPECT_TRUE(proxy_.idle_timeout_.IsCancelled());
-    EXPECT_TRUE(proxy_.client_headers_.empty());
-    EXPECT_TRUE(proxy_.server_hostname_.empty());
-    EXPECT_TRUE(proxy_.client_data_.IsEmpty());
-    EXPECT_TRUE(proxy_.server_data_.IsEmpty());
-    EXPECT_FALSE(proxy_.read_client_handler_.get());
-    EXPECT_FALSE(proxy_.write_client_handler_.get());
-    EXPECT_FALSE(proxy_.read_server_handler_.get());
-    EXPECT_FALSE(proxy_.write_server_handler_.get());
-    EXPECT_FALSE(proxy_.is_route_requested_);
-  }
-  void ExpectReset() {
-    EXPECT_FALSE(proxy_.accept_handler_.get());
-    EXPECT_EQ(proxy_.connection_.get(), connection_.get());
-    EXPECT_FALSE(proxy_.dispatcher_);
-    EXPECT_FALSE(proxy_.dns_client_.get());
-    EXPECT_EQ(-1, proxy_.proxy_port_);
-    EXPECT_EQ(-1, proxy_.proxy_socket_);
-    EXPECT_FALSE(proxy_.server_async_connection_.get());
-    EXPECT_FALSE(proxy_.sockets_);
-    EXPECT_EQ(HTTPProxy::kStateIdle, proxy_.state_);
-    ExpectClientReset();
-  }
-  void ExpectStart() {
-    EXPECT_CALL(sockets(), Socket(_, _, _))
-        .WillOnce(Return(kProxyFD));
-    EXPECT_CALL(sockets(), Bind(kProxyFD, _, _))
-        .WillOnce(Return(0));
-    EXPECT_CALL(sockets(), GetSockName(kProxyFD, _, _))
-        .WillOnce(Invoke(this, &HTTPProxyTest::InvokeGetSockName));
-    EXPECT_CALL(sockets(), SetNonBlocking(kProxyFD))
-        .WillOnce(Return(0));
-    EXPECT_CALL(sockets(), Listen(kProxyFD, _))
-        .WillOnce(Return(0));
-    EXPECT_CALL(dispatcher_,
-                CreateReadyHandler(kProxyFD,
-                                   IOHandler::kModeInput,
-                                   CallbackEq(proxy_.accept_callback_)))
-        .WillOnce(ReturnNew<IOHandler>());
-  }
-  void ExpectStop() {
-     if (dns_client_) {
-       EXPECT_CALL(*dns_client_, Stop())
-           .Times(AtLeast(1));
-     }
-     if (server_async_connection_) {
-       EXPECT_CALL(*server_async_connection_, Stop())
-           .Times(AtLeast(1));
-     }
-     if (proxy_.is_route_requested_) {
-       EXPECT_CALL(*connection_.get(), ReleaseRouting());
-     }
-  }
-  void ExpectClientInput(int fd) {
-    EXPECT_CALL(sockets(), Accept(kProxyFD, _, _))
-        .WillOnce(Return(fd));
-    EXPECT_CALL(sockets(), SetNonBlocking(fd))
-        .WillOnce(Return(0));
-    EXPECT_CALL(dispatcher(),
-                CreateInputHandler(fd,
-                                   CallbackEq(proxy_.read_client_callback_), _))
-        .WillOnce(ReturnNew<IOHandler>());
-    ExpectTransactionTimeout();
-    ExpectClientHeaderTimeout();
-  }
-  void ExpectTimeout(int timeout) {
-    EXPECT_CALL(dispatcher_, PostDelayedTask(_, timeout * 1000));
-  }
-  void ExpectClientHeaderTimeout() {
-    ExpectTimeout(HTTPProxy::kClientHeaderTimeoutSeconds);
-  }
-  void ExpectConnectTimeout() {
-    ExpectTimeout(HTTPProxy::kConnectTimeoutSeconds);
-  }
-  void ExpectInputTimeout() {
-    ExpectTimeout(HTTPProxy::kInputTimeoutSeconds);
-  }
-  void ExpectRepeatedInputTimeout() {
-    EXPECT_CALL(dispatcher_,
-                PostDelayedTask(_, HTTPProxy::kInputTimeoutSeconds * 1000))
-        .Times(AnyNumber());
-  }
-  void ExpectTransactionTimeout() {
-    ExpectTimeout(HTTPProxy::kTransactionTimeoutSeconds);
-  }
-  void ExpectInClientResponse(const string& response_data) {
-    string server_data(reinterpret_cast<char*>(proxy_.server_data_.GetData()),
-                       proxy_.server_data_.GetLength());
-    EXPECT_NE(string::npos, server_data.find(response_data));
-  }
-  void ExpectClientError(int code, const string& error) {
-    EXPECT_EQ(HTTPProxy::kStateFlushResponse, GetProxyState());
-    string status_line = StringPrintf("HTTP/1.1 %d ERROR", code);
-    ExpectInClientResponse(status_line);
-    ExpectInClientResponse(error);
-  }
-  void ExpectClientInternalError() {
-    ExpectClientError(500, HTTPProxy::kInternalErrorMsg);
-  }
-  void ExpectClientVersion(const string& version) {
-    EXPECT_EQ(version, proxy_.client_version_);
-  }
-  void ExpectServerHostname(const string& hostname) {
-    EXPECT_EQ(hostname, proxy_.server_hostname_);
-  }
-  void ExpectFirstLine(const string& line) {
-    EXPECT_EQ(line, proxy_.client_headers_[0] + "\r\n");
-  }
-  void ExpectDNSRequest(const string& host, bool return_value) {
-    EXPECT_CALL(*dns_client_, Start(StrEq(host), _))
-        .WillOnce(Return(return_value));
-  }
-  void ExpectAsyncConnect(const string& address, int port,
-                          bool return_value) {
-    EXPECT_CALL(*server_async_connection_, Start(IsIPAddress(address), port))
-        .WillOnce(Return(return_value));
-  }
-  void ExpectSyncConnect(const string& address, int port) {
-    EXPECT_CALL(*server_async_connection_, Start(IsIPAddress(address), port))
-        .WillOnce(DoAll(Invoke(this, &HTTPProxyTest::InvokeSyncConnect),
-                        Return(true)));
-  }
-  void ExpectClientData() {
-    EXPECT_CALL(dispatcher(),
-                CreateReadyHandler(kClientFD,
-                                   IOHandler::kModeOutput,
-                                   CallbackEq(proxy_.write_client_callback_)))
-        .WillOnce(ReturnNew<IOHandler>());
-  }
-  void ExpectClientResult() {
-    ExpectClientData();
-    ExpectInputTimeout();
-  }
-  void ExpectServerInput() {
-    EXPECT_CALL(dispatcher(),
-                CreateInputHandler(kServerFD,
-                                   CallbackEq(proxy_.read_server_callback_), _))
-        .WillOnce(ReturnNew<IOHandler>());
-    ExpectInputTimeout();
-  }
-  void ExpectServerOutput() {
-    EXPECT_CALL(dispatcher(),
-                CreateReadyHandler(kServerFD,
-                                   IOHandler::kModeOutput,
-                                   CallbackEq(proxy_.write_server_callback_)))
-        .WillOnce(ReturnNew<IOHandler>());
-    ExpectInputTimeout();
-  }
-  void ExpectRepeatedServerOutput() {
-    EXPECT_CALL(dispatcher(),
-                CreateReadyHandler(kServerFD, IOHandler::kModeOutput,
-                                   CallbackEq(proxy_.write_server_callback_)))
-        .WillOnce(ReturnNew<IOHandler>());
-    ExpectRepeatedInputTimeout();
-  }
-  void ExpectTunnelClose() {
-    EXPECT_CALL(sockets(), Close(kClientFD))
-        .WillOnce(Return(0));
-    EXPECT_CALL(sockets(), Close(kServerFD))
-        .WillOnce(Return(0));
-    ExpectStop();
-  }
-  void ExpectRouteRequest() {
-    EXPECT_CALL(*connection_.get(), RequestRouting());
-  }
-  void ExpectRouteRelease() {
-    EXPECT_CALL(*connection_.get(), ReleaseRouting());
-  }
-
-  // Callers for various private routines in the proxy
-  bool StartProxy() {
-    bool ret = proxy_.Start(&dispatcher_, &sockets_);
-    if (ret) {
-      dns_client_ = new StrictMock<MockDNSClient>();
-      // Passes ownership.
-      proxy_.dns_client_.reset(dns_client_);
-      server_async_connection_ = new StrictMock<MockAsyncConnection>();
-      // Passes ownership.
-      proxy_.server_async_connection_.reset(server_async_connection_);
-    }
-    return ret;
-  }
-  void AcceptClient(int fd) {
-    proxy_.AcceptClient(fd);
-  }
-  void GetDNSResultFailure(const string& error_msg) {
-    Error error(Error::kOperationFailed, error_msg);
-    IPAddress address(IPAddress::kFamilyUnknown);
-    proxy_.GetDNSResult(error, address);
-  }
-  void GetDNSResultSuccess(const IPAddress& address) {
-    Error error;
-    proxy_.GetDNSResult(error, address);
-  }
-  void OnConnectCompletion(bool result, int sockfd) {
-    proxy_.OnConnectCompletion(result, sockfd);
-  }
-  void ReadFromClient(const string& data) {
-    const unsigned char* ptr =
-        reinterpret_cast<const unsigned char*>(data.c_str());
-    vector<unsigned char> data_bytes(ptr, ptr + data.length());
-    InputData proxy_data(data_bytes.data(), data_bytes.size());
-    proxy_.ReadFromClient(&proxy_data);
-  }
-  void ReadFromServer(const string& data) {
-    const unsigned char* ptr =
-        reinterpret_cast<const unsigned char*>(data.c_str());
-    vector<unsigned char> data_bytes(ptr, ptr + data.length());
-    InputData proxy_data(data_bytes.data(), data_bytes.size());
-    proxy_.ReadFromServer(&proxy_data);
-  }
-  void SendClientError(int code, const string& error) {
-    proxy_.SendClientError(code, error);
-    EXPECT_FALSE(proxy_.server_data_.IsEmpty());
-  }
-  void StopClient() {
-    EXPECT_CALL(*dns_client_, Stop());
-    EXPECT_CALL(*server_async_connection_, Stop());
-    proxy_.StopClient();
-  }
-  void StopProxy() {
-    ExpectStop();
-    proxy_.Stop();
-    server_async_connection_ = nullptr;
-    dns_client_ = nullptr;
-    ExpectReset();
-  }
-  void WriteToClient(int fd) {
-    proxy_.WriteToClient(fd);
-  }
-  void WriteToServer(int fd) {
-    proxy_.WriteToServer(fd);
-  }
-
-  void SetupClient() {
-    ExpectStart();
-    ASSERT_TRUE(StartProxy());
-    ExpectClientInput(kClientFD);
-    AcceptClient(kProxyFD);
-    EXPECT_EQ(HTTPProxy::kStateReadClientHeader, GetProxyState());
-  }
-  void SetupConnectWithRequest(const string& url, const string& http_version,
-                               const string& extra_lines) {
-    ExpectDNSRequest("www.chromium.org", true);
-    ExpectRouteRequest();
-    ReadFromClient(CreateRequest(url, http_version, extra_lines));
-    IPAddress addr(IPAddress::kFamilyIPv4);
-    EXPECT_TRUE(addr.SetAddressFromString(kServerAddress));
-    GetDNSResultSuccess(addr);
-  }
-  void SetupConnect() {
-    SetupConnectWithRequest("/", "1.1", "Host: www.chromium.org:40506");
-  }
-  void SetupConnectAsync() {
-    SetupClient();
-    ExpectAsyncConnect(kServerAddress, kServerPort, true);
-    ExpectConnectTimeout();
-    SetupConnect();
-  }
-  void SetupConnectComplete() {
-    SetupConnectAsync();
-    ExpectServerOutput();
-    OnConnectCompletion(true, kServerFD);
-    EXPECT_EQ(HTTPProxy::kStateTunnelData, GetProxyState());
-  }
-  void CauseReadError() {
-    proxy_.OnReadError(string());
-  }
-
- private:
-  const string interface_name_;
-  // Owned by the HTTPProxy, but tracked here for EXPECT().
-  StrictMock<MockAsyncConnection>* server_async_connection_;
-  vector<string> dns_servers_;
-  // Owned by the HTTPProxy, but tracked here for EXPECT().
-  StrictMock<MockDNSClient>* dns_client_;
-  MockEventDispatcher dispatcher_;
-  MockControl control_;
-  std::unique_ptr<MockDeviceInfo> device_info_;
-  scoped_refptr<MockConnection> connection_;
-  StrictMock<MockSockets> sockets_;
-  HTTPProxy proxy_;  // Destroy first, before anything it references.
-};
-
-TEST_F(HTTPProxyTest, StartFailSocket) {
-  EXPECT_CALL(sockets(), Socket(_, _, _))
-      .WillOnce(Return(-1));
-  EXPECT_FALSE(StartProxy());
-  ExpectReset();
-}
-
-TEST_F(HTTPProxyTest, StartFailBind) {
-  EXPECT_CALL(sockets(), Socket(_, _, _))
-      .WillOnce(Return(kProxyFD));
-  EXPECT_CALL(sockets(), Bind(kProxyFD, _, _))
-      .WillOnce(Return(-1));
-  EXPECT_CALL(sockets(), Close(kProxyFD))
-      .WillOnce(Return(0));
-  EXPECT_FALSE(StartProxy());
-  ExpectReset();
-}
-
-TEST_F(HTTPProxyTest, StartFailGetSockName) {
-  EXPECT_CALL(sockets(), Socket(_, _, _))
-      .WillOnce(Return(kProxyFD));
-  EXPECT_CALL(sockets(), Bind(kProxyFD, _, _))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), GetSockName(kProxyFD, _, _))
-      .WillOnce(Return(-1));
-  EXPECT_CALL(sockets(), Close(kProxyFD))
-      .WillOnce(Return(0));
-  EXPECT_FALSE(StartProxy());
-  ExpectReset();
-}
-
-TEST_F(HTTPProxyTest, StartFailSetNonBlocking) {
-  EXPECT_CALL(sockets(), Socket(_, _, _))
-      .WillOnce(Return(kProxyFD));
-  EXPECT_CALL(sockets(), Bind(kProxyFD, _, _))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), GetSockName(kProxyFD, _, _))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), SetNonBlocking(kProxyFD))
-      .WillOnce(Return(-1));
-  EXPECT_CALL(sockets(), Close(kProxyFD))
-      .WillOnce(Return(0));
-  EXPECT_FALSE(StartProxy());
-  ExpectReset();
-}
-
-TEST_F(HTTPProxyTest, StartFailListen) {
-  EXPECT_CALL(sockets(), Socket(_, _, _))
-      .WillOnce(Return(kProxyFD));
-  EXPECT_CALL(sockets(), Bind(kProxyFD, _, _))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), GetSockName(kProxyFD, _, _))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), SetNonBlocking(kProxyFD))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), Listen(kProxyFD, _))
-      .WillOnce(Return(-1));
-  EXPECT_CALL(sockets(), Close(kProxyFD))
-      .WillOnce(Return(0));
-  EXPECT_FALSE(StartProxy());
-  ExpectReset();
-}
-
-TEST_F(HTTPProxyTest, StartSuccess) {
-  ExpectStart();
-  EXPECT_TRUE(StartProxy());
-}
-
-TEST_F(HTTPProxyTest, SendClientError) {
-  SetupClient();
-  ExpectClientResult();
-  SendClientError(500, "This is an error");
-  ExpectClientError(500, "This is an error");
-
-  // We succeed in sending all but one byte of the client response.
-  int buf_len = GetServerData().GetLength();
-  EXPECT_CALL(sockets(), Send(kClientFD, _, buf_len, 0))
-      .WillOnce(Return(buf_len - 1));
-  ExpectInputTimeout();
-  WriteToClient(kClientFD);
-  EXPECT_EQ(1, GetServerData().GetLength());
-  EXPECT_EQ(HTTPProxy::kStateFlushResponse, GetProxyState());
-
-  // When we are able to send the last byte, we close the connection.
-  EXPECT_CALL(sockets(), Send(kClientFD, _, 1, 0))
-      .WillOnce(Return(1));
-  EXPECT_CALL(sockets(), Close(kClientFD))
-      .WillOnce(Return(0));
-  ExpectStop();
-  WriteToClient(kClientFD);
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, ReadMissingURL) {
-  SetupClient();
-  ExpectClientResult();
-  ReadFromClient(kBadHeaderMissingURL);
-  ExpectClientError(501, "Server could not parse HTTP method");
-}
-
-TEST_F(HTTPProxyTest, ReadMissingVersion) {
-  SetupClient();
-  ExpectClientResult();
-  ReadFromClient(kBadHeaderMissingVersion);
-  ExpectClientError(501, "Server only accepts HTTP/1.x requests");
-}
-
-TEST_F(HTTPProxyTest, ReadBadHostname) {
-  SetupClient();
-  ExpectClientResult();
-  ReadFromClient(kBadHostnameLine);
-  ExpectClientInternalError();
-}
-
-TEST_F(HTTPProxyTest, GoodFirstLineWithoutURL) {
-  SetupClient();
-  ExpectClientHeaderTimeout();
-  ReadFromClient(kBasicGetHeader);
-  ExpectClientVersion("1.1");
-  ExpectServerHostname("");
-  ExpectFirstLine(kBasicGetHeader);
-}
-
-TEST_F(HTTPProxyTest, GoodFirstLineWithURL) {
-  SetupClient();
-  ExpectClientHeaderTimeout();
-  ReadFromClient(kBasicGetHeaderWithURL);
-  ExpectClientVersion("1.1");
-  ExpectServerHostname("www.chromium.org");
-  ExpectFirstLine(kBasicGetHeader);
-}
-
-TEST_F(HTTPProxyTest, GoodFirstLineWithURLNoSlash) {
-  SetupClient();
-  ExpectClientHeaderTimeout();
-  ReadFromClient(kBasicGetHeaderWithURLNoTrailingSlash);
-  ExpectClientVersion("1.1");
-  ExpectServerHostname("www.chromium.org");
-  ExpectFirstLine(kBasicGetHeader);
-}
-
-TEST_F(HTTPProxyTest, NoHostInRequest) {
-  SetupClient();
-  ExpectClientResult();
-  ReadFromClient(CreateRequest("/", "1.1", ""));
-  ExpectClientError(400, "I don't know what host you want me to connect to");
-}
-
-TEST_F(HTTPProxyTest, TooManyColonsInHost) {
-  SetupClient();
-  ExpectClientResult();
-  ReadFromClient(CreateRequest("/", "1.1", "Host: www.chromium.org:80:40506"));
-  ExpectClientError(400, "Too many colons in hostname");
-}
-
-TEST_F(HTTPProxyTest, ClientReadError) {
-  SetupClient();
-  EXPECT_CALL(sockets(), Close(kClientFD))
-      .WillOnce(Return(0));
-  ExpectStop();
-  CauseReadError();
-  ExpectClientReset();
-}
-
-TEST_F(HTTPProxyTest, DNSRequestFailure) {
-  SetupClient();
-  ExpectRouteRequest();
-  ExpectDNSRequest("www.chromium.org", false);
-  ExpectClientResult();
-  ReadFromClient(CreateRequest("/", "1.1", "Host: www.chromium.org:40506"));
-  ExpectClientError(502, "Could not resolve hostname");
-}
-
-TEST_F(HTTPProxyTest, DNSRequestDelayedFailure) {
-  SetupClient();
-  ExpectRouteRequest();
-  ExpectDNSRequest("www.chromium.org", true);
-  ReadFromClient(CreateRequest("/", "1.1", "Host: www.chromium.org:40506"));
-  ExpectClientResult();
-  const std::string not_found_error(DNSClient::kErrorNotFound);
-  GetDNSResultFailure(not_found_error);
-  ExpectClientError(502, string("Could not resolve hostname: ") +
-                    not_found_error);
-}
-
-TEST_F(HTTPProxyTest, TrailingClientData) {
-  SetupClient();
-  ExpectRouteRequest();
-  ExpectDNSRequest("www.chromium.org", true);
-  const string trailing_data("Trailing client data");
-  ReadFromClient(CreateRequest("/", "1.1", "Host: www.chromium.org:40506") +
-                 trailing_data);
-  EXPECT_EQ(GetClientData().GetLength() - trailing_data.length(),
-            FindInRequest(trailing_data));
-  EXPECT_EQ(HTTPProxy::kStateLookupServer, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, LineContinuation) {
-  SetupClient();
-  ExpectRouteRequest();
-  ExpectDNSRequest("www.chromium.org", true);
-  string text_to_keep("X-Long-Header: this is one line\r\n"
-                      "\tand this is another");
-  ReadFromClient(CreateRequest("http://www.chromium.org/", "1.1",
-                               text_to_keep));
-  EXPECT_NE(string::npos, FindInRequest(text_to_keep));
-}
-
-// NB: This tests two different things:
-//   1) That the system replaces the value for "Proxy-Connection" headers.
-//   2) That when it replaces a header, it also removes the text in the line
-//      continuation.
-TEST_F(HTTPProxyTest, LineContinuationRemoval) {
-  SetupClient();
-  ExpectRouteRequest();
-  ExpectDNSRequest("www.chromium.org", true);
-  string text_to_remove("remove this text please");
-  ReadFromClient(CreateRequest("http://www.chromium.org/", "1.1",
-                               string("Proxy-Connection: stuff\r\n\t") +
-                               text_to_remove));
-  EXPECT_EQ(string::npos, FindInRequest(text_to_remove));
-  EXPECT_NE(string::npos, FindInRequest("Proxy-Connection: close\r\n"));
-}
-
-TEST_F(HTTPProxyTest, ConnectSynchronousFailure) {
-  SetupClient();
-  ExpectAsyncConnect(kServerAddress, kServerPort, false);
-  ExpectClientResult();
-  SetupConnect();
-  ExpectClientError(500, "Could not create socket to connect to server");
-}
-
-TEST_F(HTTPProxyTest, ConnectAsyncConnectFailure) {
-  SetupConnectAsync();
-  ExpectClientResult();
-  OnConnectCompletion(false, -1);
-  ExpectClientError(500, "Socket connection delayed failure");
-}
-
-TEST_F(HTTPProxyTest, ConnectSynchronousSuccess) {
-  SetupClient();
-  ExpectSyncConnect(kServerAddress, 999);
-  ExpectRepeatedServerOutput();
-  SetupConnectWithRequest("/", "1.1", "Host: www.chromium.org:999");
-  EXPECT_EQ(HTTPProxy::kStateTunnelData, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, ConnectIPAddresss) {
-  SetupClient();
-  ExpectSyncConnect(kServerAddress, 999);
-  ExpectRepeatedServerOutput();
-  ExpectRouteRequest();
-  ReadFromClient(CreateRequest("/", "1.1",
-                               StringPrintf("Host: %s:999", kServerAddress)));
-  EXPECT_EQ(HTTPProxy::kStateTunnelData, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, ConnectAsyncConnectSuccess) {
-  SetupConnectComplete();
-}
-
-TEST_F(HTTPProxyTest, HTTPConnectMethod) {
-  SetupClient();
-  ExpectAsyncConnect(kServerAddress, kConnectPort, true);
-  ExpectConnectTimeout();
-  ExpectRouteRequest();
-  ReadFromClient(kConnectQuery);
-  ExpectRepeatedInputTimeout();
-  ExpectClientData();
-  OnConnectCompletion(true, kServerFD);
-  ExpectInClientResponse("HTTP/1.1 200 OK\r\n\r\n");
-}
-
-TEST_F(HTTPProxyTest, TunnelData) {
-  SetupConnectComplete();
-
-  // The proxy is waiting for the server to be ready to accept data.
-  EXPECT_CALL(sockets(), Send(kServerFD, _, _, 0))
-      .WillOnce(Return(10));
-  ExpectServerInput();
-  WriteToServer(kServerFD);
-  EXPECT_CALL(sockets(), Send(kServerFD, _, _, 0))
-      .WillOnce(ReturnArg<2>());
-  ExpectInputTimeout();
-  WriteToServer(kServerFD);
-  EXPECT_EQ(HTTPProxy::kStateTunnelData, GetProxyState());
-
-  // Tunnel a reply back to the client.
-  const string server_result("200 OK ... and so on");
-  ExpectClientResult();
-  ReadFromServer(server_result);
-  EXPECT_EQ(server_result,
-            string(reinterpret_cast<const char*>(
-                GetServerData().GetConstData()),
-                   GetServerData().GetLength()));
-
-  // Allow part of the result string to be sent to the client.
-  const int part = server_result.length() / 2;
-  EXPECT_CALL(sockets(), Send(kClientFD, _, server_result.length(), 0))
-      .WillOnce(Return(part));
-  ExpectInputTimeout();
-  WriteToClient(kClientFD);
-  EXPECT_EQ(HTTPProxy::kStateTunnelData, GetProxyState());
-
-  // The Server closes the connection while the client is still reading.
-  ExpectInputTimeout();
-  ReadFromServer("");
-  EXPECT_EQ(HTTPProxy::kStateFlushResponse, GetProxyState());
-
-  // When the last part of the response is written to the client, we close
-  // all connections.
-  EXPECT_CALL(sockets(), Send(kClientFD, _, server_result.length() - part, 0))
-      .WillOnce(ReturnArg<2>());
-  ExpectTunnelClose();
-  WriteToClient(kClientFD);
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, TunnelDataFailWriteClient) {
-  SetupConnectComplete();
-  EXPECT_CALL(sockets(), Send(kClientFD, _, _, 0))
-      .WillOnce(Return(-1));
-  ExpectTunnelClose();
-  WriteToClient(kClientFD);
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, TunnelDataFailWriteServer) {
-  SetupConnectComplete();
-  EXPECT_CALL(sockets(), Send(kServerFD, _, _, 0))
-      .WillOnce(Return(-1));
-  ExpectTunnelClose();
-  WriteToServer(kServerFD);
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, TunnelDataFailReadServer) {
-  SetupConnectComplete();
-  EXPECT_CALL(sockets(), Send(kServerFD, _, _, 0))
-      .WillOnce(Return(10));
-  ExpectServerInput();
-  WriteToServer(kServerFD);
-  ExpectTunnelClose();
-  CauseReadError();
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, TunnelDataFailClientClose) {
-  SetupConnectComplete();
-  ExpectTunnelClose();
-  ReadFromClient("");
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, TunnelDataFailServerClose) {
-  SetupConnectComplete();
-  ExpectTunnelClose();
-  ReadFromServer("");
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-TEST_F(HTTPProxyTest, StopClient) {
-  SetupConnectComplete();
-  EXPECT_CALL(sockets(), Close(kClientFD))
-      .WillOnce(Return(0));
-  EXPECT_CALL(sockets(), Close(kServerFD))
-      .WillOnce(Return(0));
-  ExpectRouteRelease();
-  StopClient();
-  ExpectClientReset();
-  EXPECT_EQ(HTTPProxy::kStateWaitConnection, GetProxyState());
-}
-
-}  // namespace shill
diff --git a/scope_logger.cc b/scope_logger.cc
index 815503f..fce1676 100644
--- a/scope_logger.cc
+++ b/scope_logger.cc
@@ -44,7 +44,6 @@
   "dns",
   "ethernet",
   "http",
-  "httpproxy",
   "inet",
   "link",
   "manager",
diff --git a/scope_logger.h b/scope_logger.h
index 3d5a817..c1ee00e 100644
--- a/scope_logger.h
+++ b/scope_logger.h
@@ -49,7 +49,6 @@
     kDNS,
     kEthernet,
     kHTTP,
-    kHTTPProxy,
     kInet,
     kLink,
     kManager,
diff --git a/scope_logger_unittest.cc b/scope_logger_unittest.cc
index 8b37feb..ba55b62 100644
--- a/scope_logger_unittest.cc
+++ b/scope_logger_unittest.cc
@@ -61,7 +61,6 @@
             "dns+"
             "ethernet+"
             "http+"
-            "httpproxy+"
             "inet+"
             "link+"
             "manager+"
diff --git a/service.cc b/service.cc
index d6b2fb2..20779d3 100644
--- a/service.cc
+++ b/service.cc
@@ -37,7 +37,6 @@
 #include "shill/control_interface.h"
 #include "shill/dhcp_properties.h"
 #include "shill/error.h"
-#include "shill/http_proxy.h"
 #include "shill/logging.h"
 #include "shill/manager.h"
 #include "shill/metrics.h"
@@ -229,8 +228,6 @@
   // see an autotest depending on it.
   store_.RegisterConstString(kErrorProperty, &error_);
   store_.RegisterConstString(kErrorDetailsProperty, &error_details_);
-  HelpRegisterConstDerivedUint16(kHTTPProxyPortProperty,
-                                 &Service::GetHTTPProxyPort);
   HelpRegisterConstDerivedRpcIdentifier(kIPConfigProperty,
                                         &Service::GetIPConfigRpcIdentifier);
   HelpRegisterDerivedBool(kIsActiveProperty, &Service::IsActive, nullptr,
@@ -808,14 +805,9 @@
 
 void Service::SetConnection(const ConnectionRefPtr& connection) {
   if (connection.get()) {
-    // TODO(pstew): Make this function testable by using a factory here.
-    // http://crbug.com/216664
-    http_proxy_.reset(new HTTPProxy(connection));
-    http_proxy_->Start(dispatcher_, sockets_.get());
     Error unused_error;
     connection->set_tethering(GetTethering(&unused_error));
   } else {
-    http_proxy_.reset();
     static_ip_parameters_.ClearSavedParameters();
   }
   connection_ = connection;
@@ -1629,13 +1621,6 @@
   return (profile_ != old_profile);
 }
 
-uint16_t Service::GetHTTPProxyPort(Error* /*error*/) const {
-  if (http_proxy_.get()) {
-    return static_cast<uint16_t>(http_proxy_->proxy_port());
-  }
-  return 0;
-}
-
 string Service::GetProxyConfig(Error* error) {
   return proxy_config_;
 }
diff --git a/service.h b/service.h
index aea2ddd..d81b532 100644
--- a/service.h
+++ b/service.h
@@ -53,7 +53,6 @@
 class Endpoint;
 class Error;
 class EventDispatcher;
-class HTTPProxy;
 class KeyValueStore;
 class Manager;
 class Metrics;
@@ -802,9 +801,6 @@
   std::string GetProfileRpcId(Error* error);
   bool SetProfileRpcId(const std::string& profile, Error* error);
 
-  // Returns TCP port of service's HTTP proxy in host order.
-  uint16_t GetHTTPProxyPort(Error* error) const;
-
   std::string GetProxyConfig(Error* error);
   bool SetProxyConfig(const std::string& proxy_config, Error* error);
 
@@ -910,7 +906,6 @@
 
   std::unique_ptr<ServiceAdaptorInterface> adaptor_;
   std::unique_ptr<ServicePropertyChangeNotifier> property_change_notifier_;
-  std::unique_ptr<HTTPProxy> http_proxy_;
   ConnectionRefPtr connection_;
   StaticIPParameters static_ip_parameters_;
   Metrics* metrics_;
diff --git a/shill.gyp b/shill.gyp
index 947f444..9159915 100644
--- a/shill.gyp
+++ b/shill.gyp
@@ -491,7 +491,6 @@
         'file_reader.cc',
         'geolocation_info.cc',
         'hook_table.cc',
-        'http_proxy.cc',
         'http_request.cc',
         'http_url.cc',
         'icmp.cc',
@@ -710,7 +709,6 @@
             'fake_store.cc',
             'file_reader_unittest.cc',
             'hook_table_unittest.cc',
-            'http_proxy_unittest.cc',
             'http_request_unittest.cc',
             'http_url_unittest.cc',
             'icmp_unittest.cc',
diff --git a/vpn/vpn_service_unittest.cc b/vpn/vpn_service_unittest.cc
index b52331a..6fce988 100644
--- a/vpn/vpn_service_unittest.cc
+++ b/vpn/vpn_service_unittest.cc
@@ -252,7 +252,6 @@
 TEST_F(VPNServiceTest, SetConnection) {
   EXPECT_FALSE(service_->connection_binder_.get());
   EXPECT_FALSE(service_->connection());
-  EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
   service_->SetConnection(connection_);
   ASSERT_TRUE(service_->connection_binder_.get());
   EXPECT_EQ(connection_.get(),
@@ -262,7 +261,6 @@
 }
 
 TEST_F(VPNServiceTest, OnConnectionDisconnected) {
-  EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
   service_->SetConnection(connection_);
   EXPECT_CALL(*driver_, OnConnectionDisconnected()).Times(1);
   connection_->OnLowerDisconnect();
@@ -361,7 +359,6 @@
 TEST_F(VPNServiceTest, GetPhysicalTechnologyPropertyFailsIfNoCarrier) {
   scoped_refptr<Connection> null_connection;
 
-  EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
   service_->SetConnection(connection_);
   EXPECT_EQ(connection_.get(), service_->connection().get());
 
@@ -383,7 +380,6 @@
   EXPECT_CALL(*connection_, GetCarrierConnection())
       .WillOnce(Return(lower_connection_));
 
-  EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
   service_->SetConnection(connection_);
   EXPECT_EQ(connection_.get(), service_->connection().get());
 
@@ -407,7 +403,6 @@
 TEST_F(VPNServiceTest, GetTethering) {
   scoped_refptr<Connection> null_connection;
 
-  EXPECT_CALL(*sockets_, Socket(_, _, _)).WillOnce(Return(-1));
   service_->SetConnection(connection_);
   EXPECT_EQ(connection_.get(), service_->connection().get());