mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-31 06:01:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			152 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * nghttp2 - HTTP/2 C Library
 | |
|  *
 | |
|  * Copyright (c) 2014 Tatsuhiro Tsujikawa
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining
 | |
|  * a copy of this software and associated documentation files (the
 | |
|  * "Software"), to deal in the Software without restriction, including
 | |
|  * without limitation the rights to use, copy, modify, merge, publish,
 | |
|  * distribute, sublicense, and/or sell copies of the Software, and to
 | |
|  * permit persons to whom the Software is furnished to do so, subject to
 | |
|  * the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be
 | |
|  * included in all copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
|  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
|  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
|  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | |
|  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | |
|  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | |
|  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
|  */
 | |
| #ifndef ASIO_HTTP2_H
 | |
| #define ASIO_HTTP2_H
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <memory>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| #include <functional>
 | |
| #include <map>
 | |
| 
 | |
| #include <boost/system/error_code.hpp>
 | |
| #include <boost/asio.hpp>
 | |
| #include <boost/asio/ssl.hpp>
 | |
| 
 | |
| #include <nghttp2/nghttp2.h>
 | |
| 
 | |
| namespace nghttp2 {
 | |
| 
 | |
| namespace asio_http2 {
 | |
| 
 | |
| struct header_value {
 | |
|   // header field value
 | |
|   std::string value;
 | |
|   // true if the header field value is sensitive information, such as
 | |
|   // authorization information or short length secret cookies.  If
 | |
|   // true, those header fields are not indexed by HPACK (but still
 | |
|   // huffman-encoded), which results in lesser compression.
 | |
|   bool sensitive;
 | |
| };
 | |
| 
 | |
| // header fields.  The header field name must be lower-cased.
 | |
| using header_map = std::multimap<std::string, header_value>;
 | |
| 
 | |
| const boost::system::error_category &nghttp2_category() noexcept;
 | |
| 
 | |
| struct uri_ref {
 | |
|   std::string scheme;
 | |
|   std::string host;
 | |
|   // form after percent-encoding decoded
 | |
|   std::string path;
 | |
|   // original path, percent-encoded
 | |
|   std::string raw_path;
 | |
|   // original query, percent-encoded
 | |
|   std::string raw_query;
 | |
|   std::string fragment;
 | |
| };
 | |
| 
 | |
| // Callback function when data is arrived.  EOF is indicated by
 | |
| // passing 0 to the second parameter.
 | |
| typedef std::function<void(const uint8_t *, std::size_t)> data_cb;
 | |
| typedef std::function<void(void)> void_cb;
 | |
| typedef std::function<void(const boost::system::error_code &ec)> error_cb;
 | |
| // Callback function when request and response are finished.  The
 | |
| // parameter indicates the cause of closure.
 | |
| typedef std::function<void(uint32_t)> close_cb;
 | |
| 
 | |
| // Callback function to generate response body.  This function has the
 | |
| // same semantics with nghttp2_data_source_read_callback.  Just source
 | |
| // and user_data parameters are removed.
 | |
| //
 | |
| // Basically, write at most |len| bytes to |data| and returns the
 | |
| // number of bytes written.  If there is no data left to send, set
 | |
| // NGHTTP2_DATA_FLAG_EOF to *data_flags (e.g., *data_flags |=
 | |
| // NGHTTP2_DATA_FLAG_EOF).  If there is still data to send but they
 | |
| // are not available right now, return NGHTTP2_ERR_DEFERRED.  In case
 | |
| // of the error and request/response must be closed, return
 | |
| // NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE.
 | |
| typedef std::function<ssize_t(uint8_t *buf, std::size_t len,
 | |
|                               uint32_t *data_flags)>
 | |
|     generator_cb;
 | |
| 
 | |
| // Convenient function to create function to read file denoted by
 | |
| // |path|.  This can be passed to response::end().
 | |
| generator_cb file_generator(const std::string &path);
 | |
| 
 | |
| // Like file_generator(const std::string&), but it takes opened file
 | |
| // descriptor.  The passed descriptor will be closed when returned
 | |
| // function object is destroyed.
 | |
| generator_cb file_generator_from_fd(int fd);
 | |
| 
 | |
| // Validates path so that it does not contain directory traversal
 | |
| // vector.  Returns true if path is safe.  The |path| must start with
 | |
| // "/" otherwise returns false.  This function should be called after
 | |
| // percent-decode was performed.
 | |
| bool check_path(const std::string &path);
 | |
| 
 | |
| // Performs percent-decode against string |s|.
 | |
| std::string percent_decode(const std::string &s);
 | |
| 
 | |
| // Returns HTTP date representation of current posix time |t|.
 | |
| std::string http_date(int64_t t);
 | |
| 
 | |
| // Parses |uri| and extract scheme, host and service.  The service is
 | |
| // port component of URI (e.g., "8443") if available, otherwise it is
 | |
| // scheme (e.g., "https").
 | |
| boost::system::error_code host_service_from_uri(boost::system::error_code &ec,
 | |
|                                                 std::string &scheme,
 | |
|                                                 std::string &host,
 | |
|                                                 std::string &service,
 | |
|                                                 const std::string &uri);
 | |
| 
 | |
| enum nghttp2_asio_error {
 | |
|   NGHTTP2_ASIO_ERR_NO_ERROR = 0,
 | |
|   NGHTTP2_ASIO_ERR_TLS_NO_APP_PROTO_NEGOTIATED = 1,
 | |
| };
 | |
| 
 | |
| } // namespace asio_http2
 | |
| 
 | |
| } // namespace nghttp2
 | |
| 
 | |
| namespace boost {
 | |
| 
 | |
| namespace system {
 | |
| 
 | |
| template <> struct is_error_code_enum<nghttp2_error> {
 | |
|   BOOST_STATIC_CONSTANT(bool, value = true);
 | |
| };
 | |
| 
 | |
| template <> struct is_error_code_enum<nghttp2::asio_http2::nghttp2_asio_error> {
 | |
|   BOOST_STATIC_CONSTANT(bool, value = true);
 | |
| };
 | |
| 
 | |
| } // namespace system
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #endif // ASIO_HTTP2_H
 |