blob: 57c3425d6f39e9a3943b2a65eb137bf622ffcdbe [file] [log] [blame]
// 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 mojo {
// 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_;
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 mojo
#endif // SERVICES_HTTP_SERVER_HTTP_REQUEST_PARSER_H_