2121
2222namespace duckdb {
2323
24- shared_ptr<HTTPUtil> GetHTTPUtil (optional_ptr<FileOpener> opener) {
24+ shared_ptr<HTTPUtil> HTTPFSUtil:: GetHTTPUtil (optional_ptr<FileOpener> opener) {
2525 if (opener) {
2626 auto db = opener->TryGetDatabase ();
2727 if (db) {
@@ -32,65 +32,55 @@ shared_ptr<HTTPUtil> GetHTTPUtil(optional_ptr<FileOpener> opener) {
3232 return make_shared_ptr<HTTPFSUtil>();
3333}
3434
35- HTTPFSParams HTTPFSParams::ReadFrom (optional_ptr<FileOpener> opener, optional_ptr<FileOpenerInfo> info) {
36- HTTPFSParams result;
37- result. http_util = GetHTTPUtil (opener);
35+ unique_ptr<HTTPParams> HTTPFSUtil::InitializeParameters (optional_ptr<FileOpener> opener, optional_ptr<FileOpenerInfo> info) {
36+ auto result = make_uniq<HTTPFSParams>(* this ) ;
37+ result-> Initialize (opener);
3838
3939 // No point in continueing without an opener
4040 if (!opener) {
41- return result;
41+ return std::move ( result) ;
4242 }
4343
4444 Value value;
4545
4646 // Setting lookups
47- FileOpener::TryGetCurrentSetting (opener, " http_timeout" , result. timeout , info);
48- FileOpener::TryGetCurrentSetting (opener, " force_download" , result. force_download , info);
49- FileOpener::TryGetCurrentSetting (opener, " http_retries" , result. retries , info);
50- FileOpener::TryGetCurrentSetting (opener, " http_retry_wait_ms" , result. retry_wait_ms , info);
51- FileOpener::TryGetCurrentSetting (opener, " http_retry_backoff" , result. retry_backoff , info);
52- FileOpener::TryGetCurrentSetting (opener, " http_keep_alive" , result. keep_alive , info);
53- FileOpener::TryGetCurrentSetting (opener, " enable_server_cert_verification" , result. enable_server_cert_verification ,
47+ FileOpener::TryGetCurrentSetting (opener, " http_timeout" , result-> timeout , info);
48+ FileOpener::TryGetCurrentSetting (opener, " force_download" , result-> force_download , info);
49+ FileOpener::TryGetCurrentSetting (opener, " http_retries" , result-> retries , info);
50+ FileOpener::TryGetCurrentSetting (opener, " http_retry_wait_ms" , result-> retry_wait_ms , info);
51+ FileOpener::TryGetCurrentSetting (opener, " http_retry_backoff" , result-> retry_backoff , info);
52+ FileOpener::TryGetCurrentSetting (opener, " http_keep_alive" , result-> keep_alive , info);
53+ FileOpener::TryGetCurrentSetting (opener, " enable_server_cert_verification" , result-> enable_server_cert_verification ,
5454 info);
55- FileOpener::TryGetCurrentSetting (opener, " ca_cert_file" , result. ca_cert_file , info);
56- FileOpener::TryGetCurrentSetting (opener, " hf_max_per_page" , result. hf_max_per_page , info);
55+ FileOpener::TryGetCurrentSetting (opener, " ca_cert_file" , result-> ca_cert_file , info);
56+ FileOpener::TryGetCurrentSetting (opener, " hf_max_per_page" , result-> hf_max_per_page , info);
5757
5858 // HTTP Secret lookups
5959 KeyValueSecretReader settings_reader (*opener, info, " http" );
6060
61- auto client_context = FileOpener::TryGetClientContext (opener);
62- if (client_context) {
63- result.Initialize (*client_context);
64- } else {
65- auto db = FileOpener::TryGetDatabase (opener);
66- if (db) {
67- result.Initialize (*db);
68- }
69- }
70-
7161 string proxy_setting;
7262 if (settings_reader.TryGetSecretKey <string>(" http_proxy" , proxy_setting) && !proxy_setting.empty ()) {
7363 idx_t port;
7464 string host;
7565 HTTPUtil::ParseHTTPProxyHost (proxy_setting, host, port);
76- result. http_proxy = host;
77- result. http_proxy_port = port;
66+ result-> http_proxy = host;
67+ result-> http_proxy_port = port;
7868 }
79- settings_reader.TryGetSecretKey <string>(" http_proxy_username" , result. http_proxy_username );
80- settings_reader.TryGetSecretKey <string>(" http_proxy_password" , result. http_proxy_password );
81- settings_reader.TryGetSecretKey <string>(" bearer_token" , result. bearer_token );
69+ settings_reader.TryGetSecretKey <string>(" http_proxy_username" , result-> http_proxy_username );
70+ settings_reader.TryGetSecretKey <string>(" http_proxy_password" , result-> http_proxy_password );
71+ settings_reader.TryGetSecretKey <string>(" bearer_token" , result-> bearer_token );
8272
8373 Value extra_headers;
8474 if (settings_reader.TryGetSecretKey (" extra_http_headers" , extra_headers)) {
8575 auto children = MapValue::GetChildren (extra_headers);
8676 for (const auto &child : children) {
8777 auto kv = StructValue::GetChildren (child);
8878 D_ASSERT (kv.size () == 2 );
89- result. extra_headers [kv[0 ].GetValue <string>()] = kv[1 ].GetValue <string>();
79+ result-> extra_headers [kv[0 ].GetValue <string>()] = kv[1 ].GetValue <string>();
9080 }
9181 }
9282
93- return result;
83+ return std::move ( result) ;
9484}
9585
9686unique_ptr<HTTPClient> HTTPClientCache::GetClient () {
@@ -113,7 +103,7 @@ unique_ptr<HTTPResponse> HTTPFileSystem::PostRequest(FileHandle &handle, string
113103 string &buffer_out, char *buffer_in, idx_t buffer_in_len,
114104 string params) {
115105 auto &hfh = handle.Cast <HTTPFileHandle>();
116- auto &http_util = * hfh.http_params .http_util ;
106+ auto &http_util = hfh.http_params .http_util ;
117107 PostRequestInfo post_request (url, header_map, hfh.http_params , const_data_ptr_cast (buffer_in), buffer_in_len);
118108 auto result = http_util.Request (post_request);
119109 buffer_out = std::move (post_request.buffer_out );
@@ -123,7 +113,7 @@ unique_ptr<HTTPResponse> HTTPFileSystem::PostRequest(FileHandle &handle, string
123113unique_ptr<HTTPResponse> HTTPFileSystem::PutRequest (FileHandle &handle, string url, HTTPHeaders header_map,
124114 char *buffer_in, idx_t buffer_in_len, string params) {
125115 auto &hfh = handle.Cast <HTTPFileHandle>();
126- auto &http_util = * hfh.http_params .http_util ;
116+ auto &http_util = hfh.http_params .http_util ;
127117 string content_type = " application/octet-stream" ;
128118 PutRequestInfo put_request (url, header_map, hfh.http_params , (const_data_ptr_t )buffer_in, buffer_in_len,
129119 content_type);
@@ -132,7 +122,7 @@ unique_ptr<HTTPResponse> HTTPFileSystem::PutRequest(FileHandle &handle, string u
132122
133123unique_ptr<HTTPResponse> HTTPFileSystem::HeadRequest (FileHandle &handle, string url, HTTPHeaders header_map) {
134124 auto &hfh = handle.Cast <HTTPFileHandle>();
135- auto &http_util = * hfh.http_params .http_util ;
125+ auto &http_util = hfh.http_params .http_util ;
136126 auto http_client = hfh.GetClient ();
137127
138128 HeadRequestInfo head_request (url, header_map, hfh.http_params );
@@ -144,7 +134,7 @@ unique_ptr<HTTPResponse> HTTPFileSystem::HeadRequest(FileHandle &handle, string
144134
145135unique_ptr<HTTPResponse> HTTPFileSystem::DeleteRequest (FileHandle &handle, string url, HTTPHeaders header_map) {
146136 auto &hfh = handle.Cast <HTTPFileHandle>();
147- auto &http_util = * hfh.http_params .http_util ;
137+ auto &http_util = hfh.http_params .http_util ;
148138 auto http_client = hfh.GetClient ();
149139 DeleteRequestInfo delete_request (url, header_map, hfh.http_params );
150140 auto response = http_util.Request (delete_request, http_client);
@@ -166,7 +156,7 @@ HTTPException HTTPFileSystem::GetHTTPError(FileHandle &, const HTTPResponse &res
166156
167157unique_ptr<HTTPResponse> HTTPFileSystem::GetRequest (FileHandle &handle, string url, HTTPHeaders header_map) {
168158 auto &hfh = handle.Cast <HTTPFileHandle>();
169- auto &http_util = * hfh.http_params .http_util ;
159+ auto &http_util = hfh.http_params .http_util ;
170160
171161 D_ASSERT (hfh.cached_file_handle );
172162
@@ -215,7 +205,7 @@ unique_ptr<HTTPResponse> HTTPFileSystem::GetRequest(FileHandle &handle, string u
215205unique_ptr<HTTPResponse> HTTPFileSystem::GetRangeRequest (FileHandle &handle, string url, HTTPHeaders header_map,
216206 idx_t file_offset, char *buffer_out, idx_t buffer_out_len) {
217207 auto &hfh = handle.Cast <HTTPFileHandle>();
218- auto &http_util = * hfh.http_params .http_util ;
208+ auto &http_util = hfh.http_params .http_util ;
219209
220210 // send the Range header to read only subset of file
221211 string range_expr = " bytes=" + to_string (file_offset) + " -" + to_string (file_offset + buffer_out_len - 1 );
@@ -286,8 +276,8 @@ void TimestampToTimeT(timestamp_t timestamp, time_t &result) {
286276}
287277
288278HTTPFileHandle::HTTPFileHandle (FileSystem &fs, const OpenFileInfo &file, FileOpenFlags flags,
289- HTTPFSParams http_params_p )
290- : FileHandle(fs, file.path, flags), http_params (std::move(http_params_p )), flags(flags), length(0 ),
279+ unique_ptr<HTTPParams> params_p )
280+ : FileHandle(fs, file.path, flags), params (std::move(params_p)), http_params(params->Cast<HTTPFSParams>( )), flags(flags), length(0 ),
291281 buffer_available (0 ), buffer_idx(0 ), file_offset(0 ), buffer_start(0 ), buffer_end(0 ) {
292282 // check if the handle has extended properties that can be set directly in the handle
293283 // if we have these properties we don't need to do a head request to obtain them later
@@ -318,7 +308,9 @@ unique_ptr<HTTPFileHandle> HTTPFileSystem::CreateHandle(const OpenFileInfo &file
318308
319309 FileOpenerInfo info;
320310 info.file_path = file.path ;
321- auto params = HTTPFSParams::ReadFrom (opener, info);
311+
312+ auto http_util = HTTPFSUtil::GetHTTPUtil (opener);
313+ auto params = http_util->InitializeParameters (opener, info);
322314
323315 auto secret_manager = FileOpener::TryGetSecretManager (opener);
324316 auto transaction = FileOpener::TryGetCatalogTransaction (opener);
@@ -327,10 +319,11 @@ unique_ptr<HTTPFileHandle> HTTPFileSystem::CreateHandle(const OpenFileInfo &file
327319
328320 if (secret_match.HasMatch ()) {
329321 const auto &kv_secret = dynamic_cast <const KeyValueSecret &>(*secret_match.secret_entry ->secret );
330- params.bearer_token = kv_secret.TryGetValue (" token" , true ).ToString ();
322+ auto &httpfs_params = params->Cast <HTTPFSParams>();
323+ httpfs_params.bearer_token = kv_secret.TryGetValue (" token" , true ).ToString ();
331324 }
332325 }
333- return duckdb::make_uniq<HTTPFileHandle>(*this , file, flags, params);
326+ return duckdb::make_uniq<HTTPFileHandle>(*this , file, flags, std::move ( params) );
334327}
335328
336329unique_ptr<FileHandle> HTTPFileSystem::OpenFileExtended (const OpenFileInfo &file, FileOpenFlags flags,
@@ -711,7 +704,7 @@ unique_ptr<HTTPClient> HTTPFileHandle::CreateClient() {
711704 // Create a new client
712705 string path_out, proto_host_port;
713706 HTTPUtil::DecomposeURL (path, path_out, proto_host_port);
714- return http_params.http_util -> InitializeClient (http_params, proto_host_port);
707+ return http_params.http_util . InitializeClient (http_params, proto_host_port);
715708}
716709
717710void HTTPFileHandle::StoreClient (unique_ptr<HTTPClient> client) {
0 commit comments