// file : web/apache/request -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef WEB_APACHE_REQUEST #define WEB_APACHE_REQUEST #include #include #include #include #include #include #include // unique_ptr #include #include #include #include #include // move() #include #include #include #include #include namespace web { namespace apache { class request: public web::request, public web::response, public write_state { friend class service; request (request_rec* rec) noexcept: rec_ (rec) {rec_->status = HTTP_OK;} // Flush of buffered content. // int flush (); // Return true if content have been sent to the client, false otherwise. // bool get_write_state () const noexcept {return write_state_;} // Get request path. // virtual const path_type& path (); // Get request body data stream. // virtual std::istream& content (); // Get request parameters. // virtual const name_values& parameters (); // 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 = 0, const char* path = 0, const char* domain = 0, bool secure = false); private: // Get application/x-www-form-urlencoded form data. // const std::string& form_data (); void parse_parameters (const char* args); virtual void set_write_state () { if (!write_state_) { // Preparing to write a response read and discard request // body if any. // int r (ap_discard_request_body (rec_)); if (r != OK) { throw invalid_request (r); } write_state_ = true; } } private: request_rec* rec_; bool buffer_ {true}; bool write_state_ {false}; std::unique_ptr out_buf_; std::unique_ptr out_; std::unique_ptr in_buf_; std::unique_ptr in_; path_type path_; std::unique_ptr parameters_; std::unique_ptr cookies_; std::unique_ptr form_data_; }; } } #include #endif // WEB_APACHE_REQUEST