/**
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
 */
/**
 * @file Request.h
 */

// The C++ Plugin API is deprecated in ATS 10, and will be removed in ATS 11.

#pragma once

#include "tscpp/api/Headers.h"
#include "tscpp/api/HttpVersion.h"
#include "tscpp/api/HttpMethod.h"
#include "tscpp/api/Url.h"
#include "tscpp/api/noncopyable.h"

namespace atscppapi
{
namespace utils
{
  class internal;
}

class Transaction;
struct RequestState;

/**
 * @brief Encapsulates a request.
 */
class Request : noncopyable
{
public:
  Request();

  /**
   * Constructed with an initial URL.
   */
  Request(const std::string &url, HttpMethod method = HTTP_METHOD_GET, HttpVersion version = HTTP_VERSION_1_1);

  /** @return HTTP method of the request */
  HttpMethod getMethod() const;

  /** @return URL of the request */
  Url &getUrl();

  /** @return HTTP version of the request */
  HttpVersion getVersion() const;

  /** @return Headers of the request */
  Headers &getHeaders() const;

  /** Set the @a host for the request.

      This sets all elements of the request related to the host. A @c
      HOST header will be forced or updated, and the URL updated if it
      already contains a host.

      @note This is not the same as setting the @c HOST header
      explicitly - that can lead to a malformed request where the host
      in the method URL is different from the host in the HOST field.
  */
  void setHost(std::string const &host);

  ~Request();

private:
  Request(void *hdr_buf, void *hdr_loc);
  std::unique_ptr<RequestState> state_;
  void                          init(void *hdr_buf, void *hdr_loc);
  void                          reset();
  friend class Transaction;
  friend class ClientRequest;
  friend class utils::internal;
};
} // namespace atscppapi
