| // 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 "mojo/services/http_server/interfaces/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(); |
| |
| HttpRequestPtr http_request_; |
| mojo::ScopedDataPipeProducerHandle producer_handle_; |
| std::string buffer_; |
| size_t buffer_position_; // Current position in the internal buffer. |
| State state_; |
| // Remaining bytes of the request content not yet put onto request->body. |
| size_t remaining_content_bytes_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HttpRequestParser); |
| }; |
| |
| } // namespace http_server |
| |
| #endif // SERVICES_HTTP_SERVER_HTTP_REQUEST_PARSER_H_ |