@@ -737,6 +737,8 @@ class RegexMatcher : public MatcherBase {
737737 std::regex regex_;
738738};
739739
740+ ssize_t write_headers (Stream &strm, const Headers &headers);
741+
740742} // namespace detail
741743
742744class Server {
@@ -800,6 +802,8 @@ class Server {
800802 Server &set_socket_options (SocketOptions socket_options);
801803
802804 Server &set_default_headers (Headers headers);
805+ Server &
806+ set_header_writer (std::function<ssize_t (Stream &, Headers &)> const &writer);
803807
804808 Server &set_keep_alive_max_count (size_t count);
805809 Server &set_keep_alive_timeout (time_t sec);
@@ -934,6 +938,8 @@ class Server {
934938 SocketOptions socket_options_ = default_socket_options;
935939
936940 Headers default_headers_;
941+ std::function<ssize_t (Stream &, Headers &)> header_writer_ =
942+ detail::write_headers;
937943};
938944
939945enum class Error {
@@ -1164,6 +1170,9 @@ class ClientImpl {
11641170
11651171 void set_default_headers (Headers headers);
11661172
1173+ void
1174+ set_header_writer (std::function<ssize_t (Stream &, Headers &)> const &writer);
1175+
11671176 void set_address_family (int family);
11681177 void set_tcp_nodelay (bool on);
11691178 void set_socket_options (SocketOptions socket_options);
@@ -1273,6 +1282,10 @@ class ClientImpl {
12731282 // Default headers
12741283 Headers default_headers_;
12751284
1285+ // Header writer
1286+ std::function<ssize_t (Stream &, Headers &)> header_writer_ =
1287+ detail::write_headers;
1288+
12761289 // Settings
12771290 std::string client_cert_path_;
12781291 std::string client_key_path_;
@@ -1539,6 +1552,9 @@ class Client {
15391552
15401553 void set_default_headers (Headers headers);
15411554
1555+ void
1556+ set_header_writer (std::function<ssize_t (Stream &, Headers &)> const &writer);
1557+
15421558 void set_address_family (int family);
15431559 void set_tcp_nodelay (bool on);
15441560 void set_socket_options (SocketOptions socket_options);
@@ -5672,6 +5688,12 @@ inline Server &Server::set_default_headers(Headers headers) {
56725688 return *this ;
56735689}
56745690
5691+ inline Server &Server::set_header_writer (
5692+ std::function<ssize_t (Stream &, Headers &)> const &writer) {
5693+ header_writer_ = writer;
5694+ return *this ;
5695+ }
5696+
56755697inline Server &Server::set_keep_alive_max_count (size_t count) {
56765698 keep_alive_max_count_ = count;
56775699 return *this ;
@@ -5866,7 +5888,7 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection,
58665888 return false ;
58675889 }
58685890
5869- if (!detail::write_headers (bstrm, res.headers )) { return false ; }
5891+ if (!header_writer_ (bstrm, res.headers )) { return false ; }
58705892
58715893 // Flush buffer
58725894 auto &data = bstrm.get_buffer ();
@@ -7105,7 +7127,7 @@ inline bool ClientImpl::write_request(Stream &strm, Request &req,
71057127 const auto &path = url_encode_ ? detail::encode_url (req.path ) : req.path ;
71067128 bstrm.write_format (" %s %s HTTP/1.1\r\n " , req.method .c_str (), path.c_str ());
71077129
7108- detail::write_headers (bstrm, req.headers );
7130+ header_writer_ (bstrm, req.headers );
71097131
71107132 // Flush buffer
71117133 auto &data = bstrm.get_buffer ();
@@ -7916,6 +7938,11 @@ inline void ClientImpl::set_default_headers(Headers headers) {
79167938 default_headers_ = std::move (headers);
79177939}
79187940
7941+ inline void ClientImpl::set_header_writer (
7942+ std::function<ssize_t (Stream &, Headers &)> const &writer) {
7943+ header_writer_ = writer;
7944+ }
7945+
79197946inline void ClientImpl::set_address_family (int family) {
79207947 address_family_ = family;
79217948}
@@ -9110,6 +9137,11 @@ inline void Client::set_default_headers(Headers headers) {
91109137 cli_->set_default_headers (std::move (headers));
91119138}
91129139
9140+ inline void Client::set_header_writer (
9141+ std::function<ssize_t (Stream &, Headers &)> const &writer) {
9142+ cli_->set_header_writer (writer);
9143+ }
9144+
91139145inline void Client::set_address_family (int family) {
91149146 cli_->set_address_family (family);
91159147}
0 commit comments