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> 250f6413a253a463c8f51809d6cd08ab71b4dccf4aAlex Vakulenko#include <base/files/file.h> 26039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <base/macros.h> 27039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <base/memory/ref_counted.h> 2875d6da24dedcbc090d23de60c4f1637c3a54b392Alex Vakulenko#include <brillo/errors/error.h> 2975d6da24dedcbc090d23de60c4f1637c3a54b392Alex Vakulenko#include <brillo/streams/stream.h> 30039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#include <libwebserv/export.h> 31039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 32039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkostruct MHD_Connection; 33039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 34039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkonamespace libwebserv { 35039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 363320726e9ccf678a9accdd6994e28f0cb8454eabChristopher Wileyclass DBusProtocolHandler; 3731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 38039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkousing PairOfStrings = std::pair<std::string, std::string>; 39039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 4031a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko// This class represents the file information about a file uploaded via 4131a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko// POST request using multipart/form-data request. 42039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenkoclass LIBWEBSERV_EXPORT FileInfo final { 43039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko public: 44039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetFileName() const { return file_name_; } 45039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetContentType() const { return content_type_; } 46039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetTransferEncoding() const { return transfer_encoding_; } 4731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko void GetData( 4875d6da24dedcbc090d23de60c4f1637c3a54b392Alex Vakulenko const base::Callback<void(brillo::StreamPtr)>& success_callback, 4975d6da24dedcbc090d23de60c4f1637c3a54b392Alex Vakulenko const base::Callback<void(brillo::Error*)>& error_callback) const; 50039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 51039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko private: 526a460fede07b768210d256191cd126013a0df273Christopher Wiley friend class DBusServer; 5331a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 543320726e9ccf678a9accdd6994e28f0cb8454eabChristopher Wiley LIBWEBSERV_PRIVATE FileInfo(DBusProtocolHandler* handler, 5531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko int file_id, 5631a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& request_id, 5731a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& file_name, 5831a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& content_type, 5931a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko const std::string& transfer_encoding); 6031a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 613320726e9ccf678a9accdd6994e28f0cb8454eabChristopher Wiley DBusProtocolHandler* handler_{nullptr}; 6231a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko int file_id_{0}; 6331a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko std::string request_id_; 64039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string file_name_; 65039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string content_type_; 66039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string transfer_encoding_; 67039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 68039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko DISALLOW_COPY_AND_ASSIGN(FileInfo); 69039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko}; 70039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 71039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko// A class that represents the HTTP request data. 72692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Bookclass LIBWEBSERV_EXPORT Request { 73039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko public: 74692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Book Request(const std::string& url, const std::string& method) 75692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Book : url_{url}, method_{method} {} 76692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Book virtual ~Request() = default; 77039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 78039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the request body data stream. Note that the stream is available 79039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // only for requests that provided data and if this data is not already 80039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // pre-parsed by the server (e.g. "application/x-www-form-urlencoded" and 81039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // "multipart/form-data"). If there is no request body, or the data has been 82039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // pre-parsed by the server, the returned stream will be empty. 830f6413a253a463c8f51809d6cd08ab71b4dccf4aAlex Vakulenko // The stream returned is valid for as long as the Request object itself is 840f6413a253a463c8f51809d6cd08ab71b4dccf4aAlex Vakulenko // alive. Accessing the stream after the Request object is destroyed will lead 850f6413a253a463c8f51809d6cd08ab71b4dccf4aAlex Vakulenko // to an undefined behavior (will likely just crash). 86692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Book virtual brillo::StreamPtr GetDataStream() = 0; 87039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 88039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns the request path (e.g. "/path/document"). 89039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetPath() const { return url_; } 90039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 91039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns the request method (e.g. "GET", "POST", etc). 92039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko const std::string& GetMethod() const { return method_; } 93039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 94039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs that include values provided on the URL 95039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // (e.g. "http://server.com/?foo=bar") and the non-file form fields in the 96039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // POST data. 97039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormData() const; 98039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 99039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for query parameters provided on the URL 100039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // (e.g. "http://server.com/?foo=bar"). 101039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormDataGet() const; 102039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 103039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for the non-file form fields in the 104039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // POST data. 105039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetFormDataPost() const; 106039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 107039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of file information records for all the file uploads in 108039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // the POST request. 109039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::pair<std::string, const FileInfo*>> GetFiles() const; 110039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 111039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of form field with given |name|. This includes both 112039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // values provided on the URL and as part of form data in POST request. 113039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormField(const std::string& name) const; 114039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 115039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of form field with given |name| for form data in POST 116039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // request. 117039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormFieldPost(const std::string& name) const; 118039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 119039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the values of URL query parameters with given |name|. 120039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetFormFieldGet(const std::string& name) const; 121039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 122039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Gets the file upload parameters for a file form field of given |name|. 123039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<const FileInfo*> GetFileInfo(const std::string& name) const; 124039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 125039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko // Returns a list of key-value pairs for all the request headers. 126039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<PairOfStrings> GetHeaders() const; 127039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 12831a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // Returns the value(s) of a request header of given |name|. 129039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::vector<std::string> GetHeader(const std::string& name) const; 130039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 13131a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // Returns the value of a request header of given |name|. If there are more 13231a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // than one header with this name, the value of the first header is returned. 13331a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko // An empty string is returned if the header does not exist in the request. 13431a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko std::string GetFirstHeader(const std::string& name) const; 13531a6379d5f773cb40312d2085e07f30cf3ac685dAlex Vakulenko 136692fdfda682376f73aaf085ed6cc58ecfa0f32a5Christopher Book protected: 137039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string url_; 138039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::string method_; 139039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> post_data_; 140039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> get_data_; 141039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::unique_ptr<FileInfo>> file_info_; 142039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko std::multimap<std::string, std::string> headers_; 143039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko}; 144039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 145039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko} // namespace libwebserv 146039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko 147039da31d4ac1a92ab9aad2273083028ede43054Alex Vakulenko#endif // WEBSERVER_LIBWEBSERV_REQUEST_H_ 148