// Copyright 2014 The Crashpad Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_ #define CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_ #include #include #include #include "base/macros.h" #include "util/file/file_reader.h" #include "util/net/http_headers.h" namespace crashpad { class HTTPBodyStream; //! \brief This class is used to build a MIME multipart message, conforming to //! RFC 2046, for use as a HTTP request body. class HTTPMultipartBuilder { public: HTTPMultipartBuilder(); ~HTTPMultipartBuilder(); //! \brief Enables or disables `gzip` compression. //! //! \param[in] gzip_enabled Whether to enable or disable `gzip` compression. //! //! When `gzip` compression is enabled, the body stream returned by //! GetBodyStream() will be `gzip`-compressed, and the content headers set by //! PopulateContentHeaders() will contain `Content-Encoding: gzip`. void SetGzipEnabled(bool gzip_enabled); //! \brief Sets a `Content-Disposition: form-data` key-value pair. //! //! \param[in] key The key of the form data, specified as the `name` in the //! multipart message. Any data previously set on this class with this //! key will be overwritten. //! \param[in] value The value to set at the \a key. void SetFormData(const std::string& key, const std::string& value); //! \brief Specifies the contents read from \a reader to be uploaded as //! multipart data, available at `name` of \a upload_file_name. //! //! \param[in] key The key of the form data, specified as the `name` in the //! multipart message. Any data previously set on this class with this //! key will be overwritten. //! \param[in] upload_file_name The `filename` to specify for this multipart //! data attachment. //! \param[in] reader A FileReaderInterface from which to read the content to //! upload. //! \param[in] content_type The `Content-Type` to specify for the attachment. //! If this is empty, `"application/octet-stream"` will be used. void SetFileAttachment(const std::string& key, const std::string& upload_file_name, FileReaderInterface* reader, const std::string& content_type); //! \brief Generates the HTTPBodyStream for the data currently supplied to //! the builder. //! //! \return A caller-owned HTTPBodyStream object. std::unique_ptr GetBodyStream(); //! \brief Adds the appropriate content headers to \a http_headers. //! //! Any headers that this method adds will replace existing headers by the //! same name in \a http_headers. void PopulateContentHeaders(HTTPHeaders* http_headers) const; private: struct FileAttachment { std::string filename; std::string content_type; FileReaderInterface* reader; }; // Removes elements from both data maps at the specified |key|, to ensure // uniqueness across the entire HTTP body. void EraseKey(const std::string& key); std::string boundary_; std::map form_data_; std::map file_attachments_; bool gzip_enabled_; DISALLOW_COPY_AND_ASSIGN(HTTPMultipartBuilder); }; } // namespace crashpad #endif // CRASHPAD_UTIL_NET_HTTP_MULTIPART_BUILDER_H_