@@ -301,35 +301,61 @@ void ResourceLoader::handle_about_load_request(LoadRequest const& request, Callb
301301 }));
302302}
303303
304- void ResourceLoader::load (LoadRequest& request, GC::Root<SuccessCallback> success_callback, GC::Root<ErrorCallback> error_callback, Optional<u32 > timeout, GC::Root<TimeoutCallback> timeout_callback)
304+ template <typename ResourceHandler, typename ErrorHandler>
305+ void ResourceLoader::handle_resource_load_request (LoadRequest const & request, ResourceHandler on_resource, ErrorHandler on_error)
305306{
306307 auto const & url = request.url ().value ();
307308
308- log_request_start (request);
309- request.start_timer ();
310-
311- if (should_block_request (request)) {
312- error_callback->function ()(" Request was blocked" , {}, {}, {}, {}, {});
309+ auto resource = Core::Resource::load_from_uri (url.serialize ());
310+ if (resource.is_error ()) {
311+ on_error (ByteString::formatted (" {}" , resource.error ()));
313312 return ;
314313 }
315314
316- auto respond_directory_page = [](LoadRequest const & request, URL::URL const & url, GC::Root<SuccessCallback> success_callback, GC::Root<ErrorCallback> error_callback) {
317- // FIXME: Implement timing info for directory requests.
318- Requests::RequestTimingInfo fixme_implement_timing_info {};
315+ auto resource_value = resource.release_value ();
319316
320- auto maybe_response = load_file_directory_page (url);
317+ // When resource URI is a directory use file directory loader to generate response
318+ if (resource_value->is_directory ()) {
319+ auto directory_url = URL::Parser::basic_parse (resource_value->file_url ());
320+ VERIFY (directory_url.has_value ());
321+
322+ auto maybe_response = load_file_directory_page (directory_url.release_value ());
321323 if (maybe_response.is_error ()) {
322- log_failure (request, maybe_response.error ());
323- if (error_callback)
324- error_callback->function ()(ByteString::formatted (" {}" , maybe_response.error ()), fixme_implement_timing_info, 500u , {}, {}, {});
324+ on_error (ByteString::formatted (" {}" , maybe_response.error ()));
325325 return ;
326326 }
327327
328- log_success (request);
329- HTTP::HeaderMap response_headers;
330- response_headers.set (" Content-Type" sv, " text/html" sv);
331- success_callback->function ()(maybe_response.release_value ().bytes (), fixme_implement_timing_info, response_headers, {}, {});
332- };
328+ FileLoadResult load_result;
329+ load_result.data = maybe_response.release_value ().bytes ();
330+ load_result.response_headers .set (" Content-Type" sv, " text/html" sv);
331+ on_resource (load_result);
332+ return ;
333+ }
334+
335+ auto const & buffer = resource_value->data ();
336+ auto response_headers = response_headers_for_file (url.file_path (), resource_value->modified_time ());
337+
338+ // FIXME: Implement timing info for resource requests.
339+ Requests::RequestTimingInfo timing_info {};
340+
341+ FileLoadResult load_result;
342+ load_result.data = buffer;
343+ load_result.response_headers = move (response_headers);
344+ load_result.timing_info = timing_info;
345+ on_resource (load_result);
346+ }
347+
348+ void ResourceLoader::load (LoadRequest& request, GC::Root<SuccessCallback> success_callback, GC::Root<ErrorCallback> error_callback, Optional<u32 > timeout, GC::Root<TimeoutCallback> timeout_callback)
349+ {
350+ auto const & url = request.url ().value ();
351+
352+ log_request_start (request);
353+ request.start_timer ();
354+
355+ if (should_block_request (request)) {
356+ error_callback->function ()(" Request was blocked" , {}, {}, {}, {}, {});
357+ return ;
358+ }
333359
334360 if (url.scheme () == " about" ) {
335361 handle_about_load_request (request, [success_callback, request](ReadonlyBytes data, Requests::RequestTimingInfo const & timing_info, HTTP::HeaderMap const & response_headers) {
@@ -368,31 +394,17 @@ void ResourceLoader::load(LoadRequest& request, GC::Root<SuccessCallback> succes
368394 }
369395
370396 if (url.scheme () == " resource" ) {
371- auto resource = Core::Resource::load_from_uri (url.serialize ());
372- if (resource.is_error ()) {
373- log_failure (request, resource.error ());
374- if (error_callback)
375- error_callback->function ()(ByteString::formatted (" {}" , resource.error ()), {}, {}, {}, {}, {});
376- return ;
377- }
378-
379- // When resource URI is a directory use file directory loader to generate response
380- if (resource.value ()->is_directory ()) {
381- auto url = URL::Parser::basic_parse (resource.value ()->file_url ());
382- VERIFY (url.has_value ());
383- respond_directory_page (request, url.release_value (), success_callback, error_callback);
384- return ;
385- }
386-
387- auto data = resource.value ()->data ();
388- auto response_headers = response_headers_for_file (url.file_path (), resource.value ()->modified_time ());
389-
390- // FIXME: Implement timing info for resource requests.
391- Requests::RequestTimingInfo fixme_implement_timing_info {};
392-
393- log_success (request);
394- success_callback->function ()(data, fixme_implement_timing_info, response_headers, {}, {});
395-
397+ handle_resource_load_request (
398+ request,
399+ [success_callback, request](FileLoadResult const & load_result) {
400+ log_success (request);
401+ success_callback->function ()(load_result.data , load_result.timing_info , load_result.response_headers , {}, {});
402+ },
403+ [error_callback, request](ByteString const & error_message) {
404+ log_failure (request, error_message);
405+ if (error_callback)
406+ error_callback->function ()(error_message, {}, {}, {}, {}, {});
407+ });
396408 return ;
397409 }
398410
@@ -499,6 +511,21 @@ void ResourceLoader::load_unbuffered(LoadRequest& request, GC::Root<OnHeadersRec
499511 return ;
500512 }
501513
514+ if (url.scheme () == " resource" sv) {
515+ handle_resource_load_request (
516+ request,
517+ [on_headers_received, on_data_received, on_complete](FileLoadResult const & load_result) {
518+ on_headers_received->function ()(load_result.response_headers , {}, {});
519+ on_data_received->function ()(load_result.data );
520+ on_complete->function ()(true , load_result.timing_info , {});
521+ },
522+ [on_complete](ByteString const & message) {
523+ Requests::RequestTimingInfo fixme_implement_timing_info {};
524+ on_complete->function ()(false , fixme_implement_timing_info, StringView (message));
525+ });
526+ return ;
527+ }
528+
502529 if (url.scheme () == " file" sv) {
503530 handle_file_load_request (
504531 request,
0 commit comments