2026-03-06 10:00:39 +01:00
#pragma once
#include "common.h"
#include "http.h"
#include <string>
#include <unordered_set>
#include <list>
#include <map>
#include "server-http.h"
static server_http_res_ptr proxy_request ( const server_http_req & req , std :: string method ) {
std :: string target_url = req . get_param ( "url" );
common_http_url parsed_url = common_http_parse_url ( target_url );
if ( parsed_url . host . empty ()) {
throw std :: runtime_error ( "invalid target URL: missing host" );
}
if ( parsed_url . path . empty ()) {
parsed_url . path = "/" ;
}
if ( ! parsed_url . password . empty ()) {
throw std :: runtime_error ( "authentication in target URL is not supported" );
}
if ( parsed_url . scheme != "http" && parsed_url . scheme != "https" ) {
throw std :: runtime_error ( "unsupported URL scheme in target URL: " + parsed_url . scheme );
}
2026-03-09 12:47:54 -04:00
SRV_INF ( "proxying %s request to %s://%s:%i%s \n " , method . c_str (), parsed_url . scheme . c_str (), parsed_url . host . c_str (), parsed_url . port , parsed_url . path . c_str ());
2026-03-06 10:00:39 +01:00
2026-03-30 08:59:16 +02:00
std :: map < std :: string , std :: string > headers ;
for ( auto [ key , value ] : req . headers ) {
auto new_key = key ;
2026-03-31 17:47:46 +02:00
if ( string_starts_with ( new_key , "x-proxy-header-" )) {
string_replace_all ( new_key , "x-proxy-header-" , "" );
2026-03-30 08:59:16 +02:00
}
headers [ new_key ] = value ;
}
2026-03-06 10:00:39 +01:00
auto proxy = std :: make_unique < server_http_proxy > (
method ,
2026-03-09 12:47:54 -04:00
parsed_url . scheme ,
2026-03-06 10:00:39 +01:00
parsed_url . host ,
2026-03-09 12:47:54 -04:00
parsed_url . port ,
2026-03-06 10:00:39 +01:00
parsed_url . path ,
2026-03-30 08:59:16 +02:00
headers ,
2026-03-06 10:00:39 +01:00
req . body ,
2026-04-27 23:55:00 +02:00
req . files ,
2026-03-06 10:00:39 +01:00
req . should_stop ,
600 , // timeout_read (default to 10 minutes)
600 // timeout_write (default to 10 minutes)
);
return proxy ;
}
static server_http_context :: handler_t proxy_handler_post = []( const server_http_req & req ) -> server_http_res_ptr {
return proxy_request ( req , "POST" );
};
static server_http_context :: handler_t proxy_handler_get = []( const server_http_req & req ) -> server_http_res_ptr {
return proxy_request ( req , "GET" );
};