934 Commits

Author SHA1 Message Date
Alex Osborne 7490998843 Merge pull request #721 from simons-hub/fix/warn-on-precedence-clipping
Log warning when URI precedence exceeds maximum 127
2026-04-06 16:54:56 +09:00
Simon 47632eb4c4 Log warning when URI precedence exceeds maximum 127
BdbMultipleWorkQueues.calculateInsertKey() silently clips precedence
values to 127 for queue ordering. This can cause unexpected behavior
for custom cost assignment policies that return values above 127.

Log a warning when clipping occurs and fix the misleading comment in
CrawlURI.holderCost that said "should not exceed 255" (the actual
limit is 127, not 255).

Fixes #502
2026-03-31 00:37:36 -07:00
Alex Osborne 3c3ae15a7c Fix test failures due to missing bdb close 2026-03-10 11:37:22 +09:00
Alex Osborne 5b3117644b FetchHTTP2: Fix IllegalArgumentException when host contains underscores
Fixes #718
2026-03-10 11:22:32 +09:00
Alex Osborne 9af99add3c FetchHTTP2: Remove HttpClient default auth protocol handlers
WWWAuthenticationProtocolHandler and ProxyAuthenticationProtocolHandler unhelpfully throw exceptions if a 401 or 407 response has a larger than 16KB body or is missing the appropriate -Authenticate header.

FetchHTTP2 doesn't yet support HTTP auth, thus they aren't currently being used, so let's just remove them for now. This also adds regression tests so that if in the future we implement auth support, we don't accidentally reintroduce this.

Fixes #714
Fixes #717
2026-03-09 22:44:57 +09:00
Alex Osborne d2562577b1 FetchHTTP2: Add SOCKS5 proxy support 2026-02-05 09:29:24 +09:00
Leslie Bellony 4d6735f7c7 Add ExtractorJson from BL (#698) 2025-12-09 17:33:18 +01:00
Leslie Bellony 771452ee83 when skipping too long value, move matcher pointer to the end of value 2025-12-08 17:01:03 +01:00
Leslie Bellony 305204af8b Issue #689 unit tests for image attributes 2025-12-04 17:10:43 +01:00
Leslie Bellony fb791e2b0c Issue #688 ignore extracted strings longer than 2048 characters 2025-12-04 14:54:06 +01:00
Manikya Rathore f75f40ab74 fix(cookie-store): normalize leading-dot domains in cookie.txt loader to resolve ignored cookies (#658) 2025-11-21 20:22:54 +05:30
Adam Miller 8d09cc4e50 feat: Pass along script tag attributes to JS extractor for configurable rejection. 2025-10-07 11:04:12 -07:00
Adam Miller e92475ac43 fix: sheet setting of extractorJs.strict doesn't work without kp keyname matching 2025-09-30 14:14:06 -07:00
Alex Osborne d484007f57 FetchHTTP2: Note that WARC doesn't specify the recording of HTTP/2 and 3
iipc/warc-specifications#106
2025-09-06 10:29:24 +09:00
Alex Osborne 219139e4e9 FetchDNS: Treat 0.0.0.0 as resolution failure
If there are multiple addresses then ignore 0.0.0.0. If the only address is 0.0.0.0 treat it as a DNS resolution failure. This should prevent us from throwing IllegalStateException later in DefaultServerCache.getHostFor().

Fixes #428
2025-08-21 09:47:48 +09:00
Alex Osborne 2388db4229 Bump commons-lang from 2.6 to 3.18.0 2025-07-21 16:55:31 +09:00
Alex Osborne acf41d598d FetchHTTP2: Use HTTP/1.1 when the server doesn't support ALPN
This fixes `IOException: frame_size_error/invalid_frame_length`.
2025-06-20 18:52:32 +09:00
Alex Osborne 8bfde99af3 FetchHTTP2: Handle getRemoteSocketAddress() returning null 2025-06-20 17:27:32 +09:00
Alex Osborne 9b5900b528 FetchHTTP2: Avoid silently decoding gzip
Fixes `Recorder getContentReplayInputStream
WARNING: gzip problem; using raw entity instead`.
2025-06-12 21:36:14 +09:00
Adam Miller 1ab9b4a206 fix: avoid bdb environment corruption when terminate is called during shutdown 2025-06-11 17:44:52 -07:00
Alex Osborne e0bae9a1b5 FetchHTTP2: Fallback to async DNS resolver 2025-06-11 16:55:11 +09:00
Alex Osborne c3f9afe64b BrowserProcessor: use FetchHTTP2's configured proxy as an upstream proxy 2025-06-10 09:01:02 +09:00
Alex Osborne cc50af72be FetchHTTP2: Add HTTP proxy support 2025-06-09 22:28:49 +09:00
Alex Osborne e68e4975c9 Rename to BrowserProcessor and -Behavior
After I added them to the Bean reference they seemed out of place with the DecideRules and RecordBuilders.

We had two classes called 'Browser' which is potentially confusing. It's also probably good to more clearly differentiate the ExtractLinks browser behavior from the Extractor processors.
2025-06-09 15:35:25 +09:00
Alex Osborne cf447f3bd9 Add Browser processor and behaviors to bean reference 2025-06-09 15:19:09 +09:00
Alex Osborne 52bbd8091b Merge pull request #653 from internetarchive/bidi
Add Browser processor using WebDriver BiDi
2025-06-09 09:36:06 +09:00
Alex Osborne c7b7ee1842 Support * and $ wildcards in robots.txt 2025-06-07 10:37:11 +09:00
Alex Osborne 1161d87217 Browser: Add processor report 2025-06-05 10:48:15 +09:00
Alex Osborne 722552feef Add Browser processor using WebDriver BiDi
The Browser processor can load a fetched page in a local web browser, record any requests the browser makes and run behaviors that interact with the page such as scrolling down and extracting links.

This differs from my previous attempt (ExtractorChrome) in a few ways:

- Uses the new WebDriver BiDi standard instead of the Chrome Devtools Protocol. The new protocol is mostly browser-agnostic, more consistent and hopefully more stable.

- Uses a MITM proxy instead of CDP request interception for recording sub-resources. That's partly because BiDi is still missing some key interception APIs. Even so in practice I found the proxy method loads pages faster and more reliably, likely because responses can be streamed incrementally, which helps a lot for large resources or server-sent events.

- Even when HTTP/2 is unavailable, the new FetchHTTP2 module does connection pooling which makes loading browser requests a lot faster. The original FetchHTTP opened a new connection for every request.

- The Browser processor can be configured with a list of behavior beans making it more customizable and extensible.

Obvious areas for future development:

- More Behavior beans: take screenshots, saveg the rendered DOM, run Browsertrix-compatible behavior scripts

- Support for remote WebDrivers (e.g. Selenium Server or cloud services)
2025-06-04 17:44:42 +09:00
Alex Osborne 567e27181d Upgrade webarchive-commons from 1.3.0 to 2.0.1 (removes httpclient 3) 2025-05-21 17:39:21 +09:00
Alex Osborne 4a2cdfaa81 FetchHTTP2: Print the jetty-quiche-native warning earlier at build time 2025-05-09 20:40:33 +09:00
Alex Osborne 8692bdf655 Add WARC-Protocol to request records too when using HTTP/2 or HTTP/3
While this could be inferred from the response, it's more accurate to
include them on the request as the request was not really HTTP/1.1.
2025-05-09 19:54:22 +09:00
Alex Osborne eb1205f6d5 Upgrade all tests to junit 5 2025-05-09 00:07:18 +09:00
Alex Osborne fcfef68aff FetchHTTP2: A new fetch module for HTTP/2 and HTTP/3
This uses Jetty HttpClient since it speaks both protocols, and we
already have it as a dependency via Restlet. This doesn't support all
the options of FetchHTTP, notably proxy and POST requests are missing.

Jetty currently has the HTTP/3 client marked as "experimental, not for
production use" so we disable it by default and don't ship the large
quiche native jar it requires. It does seem to work OK though, at least
in my limited testing so far. The HTTP/3 support currently only responds
to Alt-Svc headers not other ways of discovering HTTP/3 availability
(e.g. HTTPS DNS record).

Fetches that were made via HTTP/2 or HTTP/3 are annotated 'h2' and 'h3'
in the crawl.log. The messages are recorded in the WARC files using
HTTP/1.1 syntax with a WARC-Protocol header. FetchHTTP2 also currently
records HTTP/1.1 messages without transfer-encoding rather than the raw
wire messages.
2025-04-29 12:47:57 +09:00
Alex Osborne bc259728a0 Update to Jetty 12.0.16 and Restlet 2.6.0-M2
The Jetty API has changed, which mostly affects test code.

Jetty now does a strict SNI host check which unfortunately causes it to
return "SNI error" for our existing ad-hoc certificates. For now, I've
disabled it to avoid breaking existing deployments but added a
--sni-host-check command-line option so you can re-enable it if
you've configured your own certificate appropriately.
2025-04-24 17:40:20 +09:00
Alex Osborne 13052a1465 Fix more broken references in javadoc 2025-04-01 16:06:10 +09:00
Alex Osborne f956b2ec1f Fix broken references in javadoc 2025-04-01 15:59:38 +09:00
Alex Osborne 7f76f5abd1 FetchHTTPTest: Disable testHostHeaderDefaultPort due to random failures
Probably some of the GitHub test runners are getting blocked.
2025-04-01 15:37:21 +09:00
Alex Osborne f17000e14f Fix warning: Building a command line with string concatenation 2025-03-31 15:17:28 +09:00
Alex Osborne 60f512b4b0 Fix compiler warning: deprecated item is not annotated with @Deprecated 2025-03-31 15:12:21 +09:00
Alex Osborne f6b083ecfb Remove usages of deprecated Integer and Long constructors 2025-03-31 15:04:00 +09:00
Alex Osborne 4e8bda1a07 ExtractorHTML: Add obeyRelNofollow option
When enabled this option causes regular links annotated with rel=nofollow to not be extracted. This is useful for sites that use rel=nofollow to hint crawler traps.
2025-01-13 15:34:38 +09:00
Alex Osborne d13acddfc4 Remove usages of fastutil
fastutil is our largest dependency, consuming about a third of the
total Heritrix distribution size but we only use a couple of trivial
classes from it.

FPMergeUriUniqFilter (which I'm not sure anyone uses anyway), uses
LongArrayList so this change replaces it with a basic version that does
just enough.

The unsynchronized FastBufferedOutputStream usages are likely
unnecessary these days thanks to the JVM's lock optimisations and for
the one in CrawlerJournal, the GZIPOutputStream is still going to
be synchronizing anyway.
2024-12-20 14:37:20 +09:00
Alex Osborne d5b4391cce Bump java-socks-proxy-server from 1.1.0 to 4.1.2 2024-11-29 17:12:43 +09:00
Alex Osborne 8ec614224e Merge pull request #625 from internetarchive/spring-6.1
Upgrade to Spring 6.1 (and Java 17 minimum)
2024-11-28 16:43:30 +09:00
Alex Osborne 13075ec444 Merge pull request #624 from kris-sigur/strict-if-url-matching
Force strict if URL matching regex.
2024-11-20 17:12:08 +09:00
Alex Osborne 29cc045c22 Merge pull request #623 from kris-sigur/manfest-links
Treat manifest hops same as navlink hops
2024-11-20 17:11:55 +09:00
Alex Osborne dd210c8e70 Replace Spring's removed @Required annotation with our own
Spring 6 removed @Required and they suggest using constructor injection instead. If we switched our beans to that we'd break existing Heritrix crawl configs. So this change implements our own basic version so we still get errors when a @Required property is null.
2024-11-20 16:30:15 +09:00
Kristinn Sigurðsson 4a49557b8b Force strict if URL matching regex.
Adds a list of regular expressions that URLs being processed by the
ConfigurableExtractorJS are evaluted against. If they match the
extraction is performed in strict mode, even if strict mode is not set.

This requires a minor modification to ExtractorJS so that the CrawlURI
is passed to the shouldAddUri method that ConfigurableExtractorJS
overrides.
2024-10-30 08:53:08 +00:00
Kristinn Sigurðsson 5ed6147c3e Treat manifest hops same as navlink hops
Links from manifests (e.g. sitemaps) should not receive the preferential
treatment sometimes accorded to "transitive" hops. Most commonly this is
about giving priority to discovered (probable) embeds.

Manifests should be regarded as more analogous with a directory page.
2024-10-29 08:53:15 +00:00