blob: e6d458783368e62a21d634cdb6cf849ad77e5250 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SYSTEM_PROXY_HTTP_UTIL_H_
#define SYSTEM_PROXY_HTTP_UTIL_H_
#include <string>
#include <utility>
#include <vector>
#include <base/strings/string_util.h>
// TODO(acostinas,crbug.com/1094205): Add fuzzer tests.
namespace system_proxy {
// List of scheme and realm pairs. The |first| item in each entry represents the
// HTTP authentication scheme and |second| item represents the realm of the
// server where the challenge is originating from.
using SchemeRealmPairList = std::vector<std::pair<std::string, std::string>>;
// Verifies if the http headers are ending with an http empty line, meaning a
// line that contains only CRLF or LF preceded by a line ending with CRLF.
bool IsEndingWithHttpEmptyLine(const base::StringPiece& http_header_line);
// Analyses |input| and attempts to find a complete HTTP request (request line,
// headers and end of message). Returns false if it is not found or only a
// partial HTTP request is in |input|. Returns true if an HTTP request is found,
// and puts the HTTP request into *|out_http_request|, including the end tag
// (two newlines). Any remaining data is put into *|out_remaining_data|.
bool ExtractHTTPRequest(const std::vector<char>& input,
std::vector<char>* out_http_request,
std::vector<char>* out_remaining_data);
// Parses the first line of the http CONNECT request and extracts the URI
// authority, defined in RFC3986, section 3.2, as the host name and port number
// separated by a colon. The destination URI is specified in the request line
// (RFC2817, section 5.2):
// CONNECT server.example.com:80 HTTP/1.1
// If the first line in |raw_request| (the Request-Line) is a correctly formed
// CONNECT request, it will return the destination URI as host:port, otherwise
// it will return an empty string.
std::string GetUriAuthorityFromHttpHeader(
const base::StringPiece& http_request);
// Parses the HTTP server reply and extracts the supported authentication scheme
// and realm.
SchemeRealmPairList ParseAuthChallenge(const base::StringPiece& http_request);
} // namespace system_proxy
#endif // SYSTEM_PROXY_HTTP_UTIL_H_