diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2020-03-18 22:17:49 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2020-03-27 17:28:44 +0300 |
commit | 35359f038f571dc46de3d14af72a2bc911fb0a24 (patch) | |
tree | de3e89d678e78b9efc4d395274fd7ccc68f4a213 /web/apache/request.hxx | |
parent | 8ad672cc7211952716ffe1fbf76c179b4f1149e3 (diff) |
Implement brep-monitor
Diffstat (limited to 'web/apache/request.hxx')
-rw-r--r-- | web/apache/request.hxx | 233 |
1 files changed, 0 insertions, 233 deletions
diff --git a/web/apache/request.hxx b/web/apache/request.hxx deleted file mode 100644 index 793a09d..0000000 --- a/web/apache/request.hxx +++ /dev/null @@ -1,233 +0,0 @@ -// file : web/apache/request.hxx -*- C++ -*- -// license : MIT; see accompanying LICENSE file - -#ifndef WEB_APACHE_REQUEST_HXX -#define WEB_APACHE_REQUEST_HXX - -#include <httpd.h> // request_rec, HTTP_*, OK, M_POST - -#include <chrono> -#include <memory> // unique_ptr -#include <string> -#include <vector> -#include <istream> -#include <ostream> -#include <streambuf> - -#include <web/module.hxx> -#include <web/apache/stream.hxx> - -namespace web -{ - namespace apache - { - // The state of the request processing, reflecting an interaction with - // Apache API (like reading/writing content function calls), with no - // buffering taken into account. Any state different from the initial - // suppose that some irrevocable interaction with Apache API have - // happened, so request processing should be either completed, or - // reported as failed. State values are ordered in a sense that the - // higher value reflects the more advanced stage of processing, so the - // request current state value may not decrease. - // - enum class request_state - { - // Denotes the initial stage of the request handling. At this stage - // the request line and headers are already parsed by Apache. - // - initial, - - // Reading the request content. - // - reading, - - // Adding the response headers (cookies in particular). - // - headers, - - // Writing the response content. - // - writing - }; - - // Extends istreambuf with read limit checking, caching, etc. (see the - // implementation for details). - // - class istreambuf_cache; - - // Stream type for reading from Apache's bucket brigades. - // - class istream_buckets; - - class request: public web::request, - public web::response, - public stream_state - { - friend class service; - - // Can not be inline/default due to the member of - // unique_ptr<istreambuf_cache> type. Note that istreambuf_cache type is - // incomplete. - // - request (request_rec* rec) noexcept; - ~request (); - - request_state - state () const noexcept {return state_;} - - // Flush the buffered response content if present. The returned value - // should be passed to Apache API on request handler exit. - // - int - flush (); - - // Prepare for the request re-processing if possible (no unbuffered - // read/write operations have been done). Throw sequence_error - // otherwise. In particular, the preparation can include the response - // content buffer cleanup, the request content buffer rewind. - // - void - rewind (); - - // Get request path. - // - virtual const path_type& - path (); - - // Get request body data stream. - // - virtual std::istream& - content (std::size_t limit = 0, std::size_t buffer = 0); - - // Get request parameters. - // - virtual const name_values& - parameters (std::size_t limit, bool url_only = false); - - // Get upload stream. - // - virtual std::istream& - open_upload (std::size_t index); - - virtual std::istream& - open_upload (const std::string& name); - - // Get request headers. - // - virtual const name_values& - headers (); - - // Get request cookies. - // - virtual const name_values& - cookies (); - - // Get response status code. - // - status_code - status () const noexcept {return rec_->status;} - - // Set response status code. - // - virtual void - status (status_code status); - - // Set response status code, content type and get body stream. - // - virtual std::ostream& - content (status_code status, - const std::string& type, - bool buffer = true); - - // Add response cookie. - // - virtual void - cookie (const char* name, - const char* value, - const std::chrono::seconds* max_age = nullptr, - const char* path = nullptr, - const char* domain = nullptr, - bool secure = false, - bool buffer = true); - - private: - // On the first call cache the application/x-www-form-urlencoded or - // multipart/form-data form data for the subsequent parameters parsing - // and set the multipart flag accordingly. Don't cache if the request is - // in the reading or later state. Return true if the cache contains the - // form data. - // - // Note that the function doesn't change the content buffering (see - // content() function for details) nor rewind the content stream after - // reading. - // - bool - form_data (std::size_t limit); - - // Used to also parse application/x-www-form-urlencoded POST body. - // - void - parse_url_parameters (const char* args); - - void - parse_multipart_parameters (const std::vector<char>& body); - - // Return a list of the upload input streams. Throw sequence_error if - // the parameters() function was not called yet. Throw invalid_argument - // if the request doesn't contain multipart form data. - // - using uploads_type = std::vector<std::unique_ptr<istream_buckets>>; - - uploads_type& - uploads () const; - - // Advance the request processing state. Noop if new state is equal to - // the current one. Throw sequence_error if the new state is less then - // the current one. Can throw invalid_request if HTTP request is - // malformed. - // - void - state (request_state); - - // stream_state members implementation. - // - virtual void - set_read_state () {state (request_state::reading);} - - virtual void - set_write_state () {state (request_state::writing);} - - private: - request_rec* rec_; - request_state state_ = request_state::initial; - - path_type path_; - - std::unique_ptr<name_values> parameters_; - bool url_only_parameters_; // Meaningless if parameters_ is NULL; - - // Uploaded file streams. If not NULL, is parallel to the parameters - // list. - // - std::unique_ptr<uploads_type> uploads_; - - std::unique_ptr<name_values> headers_; - std::unique_ptr<name_values> cookies_; - - // Form data cache. Is empty if the body doesn't contain the form data. - // - std::unique_ptr<std::vector<char>> form_data_; - bool form_multipart_; // Meaningless if form_data_ is NULL or empty; - - std::unique_ptr<istreambuf_cache> in_buf_; - std::unique_ptr<std::istream> in_; - - std::unique_ptr<std::streambuf> out_buf_; - std::unique_ptr<std::ostream> out_; - }; - } -} - -#include <web/apache/request.ixx> - -#endif // WEB_APACHE_REQUEST_HXX |