// Copyright 2014 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.

#ifndef SERVICES_HTTP_SERVER_HTTP_REQUEST_PARSER_H_
#define SERVICES_HTTP_SERVER_HTTP_REQUEST_PARSER_H_

#include <map>
#include <string>

#include "base/basictypes.h"
#include "base/strings/string_piece.h"
#include "services/http_server/public/http_request.mojom.h"

namespace http_server {

// Parses the input data and produces a valid HttpRequest object. If there is
// more than one request in one chunk, then only the first one will be parsed.
class HttpRequestParser {
 public:
  // Parsing result.
  enum ParseResult {
    WAITING,  // A request is not completed yet, waiting for more data.
    ACCEPTED,  // A request has been parsed and it is ready to be processed.
    PARSE_ERROR,  // There was an error parsing the request.
  };

  HttpRequestParser();
  ~HttpRequestParser();

  // Adds chunk of data into the internal buffer.
  void ProcessChunk(const base::StringPiece& data);

  // Parses the http request (including data - if provided).
  // If returns ACCEPTED, then it means that the whole request has been found
  // in the internal buffer (and parsed).
  ParseResult ParseRequest();

  // Retrieves parsed request. Can be only called when the parser is in
  // STATE_ACCEPTED state.
  HttpRequestPtr GetRequest();

 private:
  // Parser state.
  enum State {
    STATE_HEADERS,  // Waiting for a request headers.
    STATE_CONTENT,  // Waiting for content data.
    STATE_ACCEPTED,  // Request has been parsed.
  };

  // Parses headers and returns ACCEPTED if whole request was parsed. Otherwise
  // returns WAITING.
  ParseResult ParseHeaders();

  // Parses request's content data and returns ACCEPTED if all of it have been
  // processed. Chunked Transfer Encoding *is not* supported.
  ParseResult ParseContent();

  // Fetches the next line from the buffer. Result does not contain \r\n.
  // Returns an empty string for an empty line. It will assert if there is
  // no line available.
  std::string ShiftLine();

  // Returns the number of bytes in |http_request_->body|.
  uint32_t GetBodySize();

  HttpRequestPtr http_request_;
  mojo::ScopedDataPipeProducerHandle producer_handle_;
  std::string buffer_;
  size_t buffer_position_;  // Current position in the internal buffer.
  State state_;
  // Content length of the request currently being parsed.
  size_t declared_content_length_;

  DISALLOW_COPY_AND_ASSIGN(HttpRequestParser);
};

}  // namespace http_server

#endif  // SERVICES_HTTP_SERVER_HTTP_REQUEST_PARSER_H_
