From 6d82f7ddafdb33900a2ecacb397e8ed01982948a Mon Sep 17 00:00:00 2001 From: klzgrad Date: Thu, 7 May 2026 18:57:00 +0800 Subject: [PATCH] Fix URL parsing over segmented reads --- src/net/tools/naive/preamble_getter.cc | 10 ++++++++-- src/net/tools/naive/preamble_getter.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/net/tools/naive/preamble_getter.cc b/src/net/tools/naive/preamble_getter.cc index 20c20b3eb4..427b7f191a 100644 --- a/src/net/tools/naive/preamble_getter.cc +++ b/src/net/tools/naive/preamble_getter.cc @@ -440,12 +440,17 @@ int PreambleGetter::DoReadComplete(size_t preamble_index, int result) { if (result <= 0) { return result; } + if (preamble_index != 0) { + // Skips parsing non-root pages, which is not decoded yet. + return OK; + } CHECK_LT(preamble_index, requests_.size()); Request& req = *requests_[preamble_index]; - std::string_view html(req.read_buffer->data(), static_cast(result)); - std::vector links = ExtractLinkAndScriptURLs(html); + std::string_view new_data(req.read_buffer->data(), static_cast(result)); + req.last_content.append(new_data); + std::vector links = ExtractLinkAndScriptURLs(req.last_content); for (std::string_view link : links) { GURL gurl = root_.Resolve(link); if (!gurl.is_valid()) @@ -486,6 +491,7 @@ int PreambleGetter::DoReadComplete(size_t preamble_index, int result) { requests_.back()->ext = ext; (void)Start(requests_.size() - 1, {}); } + req.last_content = new_data; req.next_state = STATE_READ; return OK; } diff --git a/src/net/tools/naive/preamble_getter.h b/src/net/tools/naive/preamble_getter.h index 1525a085ef..b4761a7c63 100644 --- a/src/net/tools/naive/preamble_getter.h +++ b/src/net/tools/naive/preamble_getter.h @@ -66,6 +66,7 @@ class PreambleGetter { std::make_unique(); std::unique_ptr upstream; scoped_refptr read_buffer; + std::string last_content; CompletionOnceCallback callback; };