Skip to content

Commit cce5197

Browse files
kalenikaliaksandrtrflynn89
authored andcommitted
LibWeb: Implement :resource support for load_unbuffered()
Preparation work before enabling unbuffered fetching by default.
1 parent 1f4b53d commit cce5197

File tree

2 files changed

+72
-43
lines changed

2 files changed

+72
-43
lines changed

Libraries/LibWeb/Loader/ResourceLoader.cpp

Lines changed: 70 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

Libraries/LibWeb/Loader/ResourceLoader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class WEB_API ResourceLoader : public Core::EventReceiver {
8282
void handle_file_load_request(LoadRequest& request, FileHandler on_file, ErrorHandler on_error);
8383
template<typename Callback>
8484
void handle_about_load_request(LoadRequest const& request, Callback callback);
85+
template<typename ResourceHandler, typename ErrorHandler>
86+
void handle_resource_load_request(LoadRequest const& request, ResourceHandler on_resource, ErrorHandler on_error);
8587

8688
RefPtr<Requests::Request> start_network_request(LoadRequest const&);
8789
void handle_network_response_headers(LoadRequest const&, HTTP::HeaderMap const&);

0 commit comments

Comments
 (0)