request.h revision 35f6587840b71c8bd3e3655508b6f05cb2593ba9
135f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// Copyright 2015 The Android Open Source Project 235f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// 335f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// Licensed under the Apache License, Version 2.0 (the "License"); 435f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// you may not use this file except in compliance with the License. 535f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// You may obtain a copy of the License at 635f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// 735f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// http://www.apache.org/licenses/LICENSE-2.0 835f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// 935f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// Unless required by applicable law or agreed to in writing, software 1035f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// distributed under the License is distributed on an "AS IS" BASIS, 1135f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1235f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// See the License for the specific language governing permissions and 1335f6587840b71c8bd3e3655508b6f05cb2593ba9Daniel Erat// limitations under the License. 14039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 15039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#ifndef WEBSERVER_LIBWEBSERV_REQUEST_H_ 16039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#define WEBSERVER_LIBWEBSERV_REQUEST_H_ 17039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 18039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <map> 19039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <memory> 20039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <string> 21039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <utility> 22039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <vector> 23039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 2431a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko#include <base/callback_forward.h> 25039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <base/macros.h> 26039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <base/memory/ref_counted.h> 2731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko#include <chromeos/errors/error.h> 28039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <libwebserv/export.h> 29039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 30039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkostruct MHD_Connection; 31039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 32039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkonamespace libwebserv { 33039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 3431a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenkoclass ProtocolHandler; 3531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 36039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkousing PairOfStrings = std::pair<std::string, std::string>; 37039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 3831a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko// This class represents the file information about a file uploaded via 3931a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko// POST request using multipart/form-data request. 40039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkoclass LIBWEBSERV_EXPORT FileInfo final { 41039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko public: 42039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetFileName() const { return file_name_; } 43039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetContentType() const { return content_type_; } 44039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetTransferEncoding() const { return transfer_encoding_; } 4531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko void GetData( 4631a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const base::Callback<void(const std::vector<uint8_t>&)>& success_callback, 4731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const base::Callback<void(chromeos::Error*)>& error_callback); 48039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 49039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko private: 5031a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko friend class Server; 5131a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 5231a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko LIBWEBSERV_PRIVATE FileInfo(ProtocolHandler* handler, 5331a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko int file_id, 5431a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& request_id, 5531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& file_name, 5631a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& content_type, 5731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& transfer_encoding); 5831a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 5931a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko ProtocolHandler* handler_{nullptr}; 6031a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko int file_id_{0}; 6131a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko std::string request_id_; 62039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string file_name_; 63039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string content_type_; 64039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string transfer_encoding_; 65039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<uint8_t> data_; 66039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 67039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko DISALLOW_COPY_AND_ASSIGN(FileInfo); 68039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko}; 69039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 70039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko// A class that represents the HTTP request data. 71039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkoclass LIBWEBSERV_EXPORT Request final { 72039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko public: 73039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko ~Request(); 74039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 75039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the request body data stream. Note that the stream is available 76039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // only for requests that provided data and if this data is not already 77039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // pre-parsed by the server (e.g. "application/x-www-form-urlencoded" and 78039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // "multipart/form-data"). If there is no request body, or the data has been 79039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // pre-parsed by the server, the returned stream will be empty. 80039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::vector<uint8_t>& GetData() const; 81039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 82039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns the request path (e.g. "/path/document"). 83039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetPath() const { return url_; } 84039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 85039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns the request method (e.g. "GET", "POST", etc). 86039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetMethod() const { return method_; } 87039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 88039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs that include values provided on the URL 89039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // (e.g. "http://server.com/?foo=bar") and the non-file form fields in the 90039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // POST data. 91039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormData() const; 92039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 93039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for query parameters provided on the URL 94039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // (e.g. "http://server.com/?foo=bar"). 95039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormDataGet() const; 96039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 97039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for the non-file form fields in the 98039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // POST data. 99039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormDataPost() const; 100039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 101039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of file information records for all the file uploads in 102039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // the POST request. 103039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::pair<std::string, const FileInfo*>> GetFiles() const; 104039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 105039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of form field with given |name|. This includes both 106039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // values provided on the URL and as part of form data in POST request. 107039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormField(const std::string& name) const; 108039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 109039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of form field with given |name| for form data in POST 110039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // request. 111039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormFieldPost(const std::string& name) const; 112039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 113039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of URL query parameters with given |name|. 114039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormFieldGet(const std::string& name) const; 115039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 116039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the file upload parameters for a file form field of given |name|. 117039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<const FileInfo*> GetFileInfo(const std::string& name) const; 118039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 119039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for all the request headers. 120039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetHeaders() const; 121039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 12231a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // Returns the value(s) of a request header of given |name|. 123039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetHeader(const std::string& name) const; 124039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 12531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // Returns the value of a request header of given |name|. If there are more 12631a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // than one header with this name, the value of the first header is returned. 12731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // An empty string is returned if the header does not exist in the request. 12831a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko std::string GetFirstHeader(const std::string& name) const; 12931a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 130039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko private: 13131a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko friend class Server; 13231a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 13331a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko LIBWEBSERV_PRIVATE Request(ProtocolHandler* handler, 13431a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& url, 13531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& method); 136039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 13731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko ProtocolHandler* handler_{nullptr}; 138039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string url_; 139039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string method_; 140039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<uint8_t> raw_data_; 141039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko bool last_posted_data_was_file_{false}; 142039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 143039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> post_data_; 144039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> get_data_; 145039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::unique_ptr<FileInfo>> file_info_; 146039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> headers_; 147039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 148039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko DISALLOW_COPY_AND_ASSIGN(Request); 149039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko}; 150039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 151039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko} // namespace libwebserv 152039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 153039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#endif // WEBSERVER_LIBWEBSERV_REQUEST_H_ 154