// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/http/http_proxy_client_socket.h"

#include <stddef.h>
#include <stdint.h>

#include <memory>
#include <string>

#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "net/base/address_list.h"
#include "net/base/auth.h"
#include "net/base/host_port_pair.h"
#include "net/base/test_completion_callback.h"
#include "net/http/http_auth_cache.h"
#include "net/http/http_auth_handler_basic.h"
#include "net/http/http_auth_handler_digest.h"
#include "net/http/http_auth_handler_factory.h"
#include "net/http/http_auth_scheme.h"
#include "net/log/test_net_log.h"
#include "net/socket/fuzzed_socket.h"
#include "net/socket/next_proto.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "third_party/libFuzzer/src/utils/FuzzedDataProvider.h"

// Fuzzer for HttpProxyClientSocket only tests establishing a connection when
// using the proxy as a tunnel.
//
// |data| is used to create a FuzzedSocket to fuzz reads and writes, see that
// class for details.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  // Use a test NetLog, to exercise logging code.
  net::TestNetLog test_net_log;

  FuzzedDataProvider data_provider(data, size);

  net::TestCompletionCallback callback;
  std::unique_ptr<net::FuzzedSocket> fuzzed_socket(
      new net::FuzzedSocket(&data_provider, &test_net_log));
  CHECK_EQ(net::OK, fuzzed_socket->Connect(callback.callback()));

  // Create auth handler supporting basic and digest schemes.  Other schemes can
  // make system calls, which doesn't seem like a great idea.
  net::HttpAuthCache auth_cache;
  net::HttpAuthHandlerRegistryFactory auth_handler_factory;
  auth_handler_factory.RegisterSchemeFactory(
      net::kBasicAuthScheme, new net::HttpAuthHandlerBasic::Factory());
  auth_handler_factory.RegisterSchemeFactory(
      net::kDigestAuthScheme, new net::HttpAuthHandlerDigest::Factory());

  scoped_refptr<net::HttpAuthController> auth_controller(
      new net::HttpAuthController(net::HttpAuth::AUTH_PROXY,
                                  GURL("http://proxy:42/"), &auth_cache,
                                  &auth_handler_factory, nullptr));
  // Determine if the HttpProxyClientSocket should be told the underlying socket
  // is HTTPS.
  net::HttpProxyClientSocket socket(
      std::move(fuzzed_socket), "Bond/007", net::HostPortPair("foo", 80),
      net::ProxyServer(net::ProxyServer::SCHEME_HTTP,
                       net::HostPortPair("proxy", 42)),
      auth_controller.get(), true /* tunnel */, false /* using_spdy */,
      net::kProtoUnknown, nullptr /* proxy_delegate */,
      TRAFFIC_ANNOTATION_FOR_TESTS);
  int result = socket.Connect(callback.callback());
  result = callback.GetResult(result);

  // Repeatedly try to log in with the same credentials.
  while (result == net::ERR_PROXY_AUTH_REQUESTED) {
    if (!auth_controller->HaveAuth()) {
      auth_controller->ResetAuth(net::AuthCredentials(
          base::ASCIIToUTF16("user"), base::ASCIIToUTF16("pass")));
    }
    result = socket.RestartWithAuth(callback.callback());
    result = callback.GetResult(result);
  }

  return 0;
}
