aboutsummaryrefslogtreecommitdiff
path: root/ricochet/src/net
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-04-13 02:11:27 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-04-13 02:11:27 +0800
commit331fde79776286de58247f565839b1eae154f7c4 (patch)
tree71d3a682c0c1e3d7f28f8122bdfbcf3a8003ff40 /ricochet/src/net
parenta01713ea09a9c451cfb556d4b4c7fd17079b833a (diff)
downloadrcc-project-331fde79776286de58247f565839b1eae154f7c4.tar.gz
rcc-project-331fde79776286de58247f565839b1eae154f7c4.tar.xz
feat: add binary file download support by parsing Content-Type headers
Diffstat (limited to 'ricochet/src/net')
-rw-r--r--ricochet/src/net/http_client.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/ricochet/src/net/http_client.cc b/ricochet/src/net/http_client.cc
index 240b234..7372247 100644
--- a/ricochet/src/net/http_client.cc
+++ b/ricochet/src/net/http_client.cc
@@ -314,6 +314,18 @@ std::expected<HttpResponse, std::string> HttpClient::fetch( std::string_view url
const auto header_end = raw_response.find( "\r\n\r\n" );
if ( header_end != std::string::npos ) {
response.body = raw_response.substr( header_end + 4 );
+ const std::string headers = raw_response.substr( 0, header_end );
+ std::size_t ct_pos = headers.find( "Content-Type: " );
+ if ( ct_pos == std::string::npos ) {
+ ct_pos = headers.find( "content-type: " );
+ }
+ if ( ct_pos != std::string::npos ) {
+ ct_pos += 14;
+ const std::size_t end_pos = headers.find( '\r', ct_pos );
+ if ( end_pos != std::string::npos ) {
+ response.content_type = headers.substr( ct_pos, end_pos - ct_pos );
+ }
+ }
if ( raw_response.size() >= 12 ) {
try {
response.status_code = std::stoi( raw_response.substr( 9, 3 ) );