JSON-Kursaktualisierung von Idealo: Read timed out

Hallo zusammen und ein frohes neues Jahr!

ich bekomme beim Kursupdate via JSON von Idealo neuerdings immer einen Timeout (Hilfe → Fehlerprotokoll anzeigen):

java.io.IOException: https://www.idealo.de/price-chart/sites/1/products/201491793/history?period=1Y
Read timed out
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:183)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:110)
	at name.abuchen.portfolio.ui.jobs.priceupdate.Task$HistoricalTask.update(Task.java:27)
	at name.abuchen.portfolio.ui.jobs.priceupdate.RunTaskGroupJob.run(RunTaskGroupJob.java:53)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/sun.nio.ch.NioSocketImpl.timedRead(Unknown Source)
	at java.base/sun.nio.ch.NioSocketImpl.implRead(Unknown Source)
	at java.base/sun.nio.ch.NioSocketImpl.read(Unknown Source)
	at java.base/sun.nio.ch.NioSocketImpl$1.read(Unknown Source)
	at java.base/java.net.Socket$SocketInputStream.read(Unknown Source)
	at java.base/sun.security.ssl.SSLSocketInputRecord.read(Unknown Source)
	at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(Unknown Source)
	at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(Unknown Source)
	at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(Unknown Source)
	at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(Unknown Source)
	at org.apache.hc.core5.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:149)
	at org.apache.hc.core5.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
	at org.apache.hc.core5.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:250)
	at org.apache.hc.core5.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:56)
	at org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:331)
	at org.apache.hc.core5.http.impl.io.HttpRequestExecutor.execute(HttpRequestExecutor.java:196)
	at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.lambda$execute$0(InternalExecRuntime.java:236)
	at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager$InternalConnectionEndpoint.execute(PoolingHttpClientConnectionManager.java:798)
	at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.execute(InternalExecRuntime.java:233)
	at org.apache.hc.client5.http.impl.classic.MainClientExec.execute(MainClientExec.java:120)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.ConnectExec.execute(ConnectExec.java:200)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ProtocolExec.java:195)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute(ContentCompressionExec.java:151)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.HttpRequestRetryExec.execute(HttpRequestRetryExec.java:112)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.RedirectExec.execute(RedirectExec.java:110)
	at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ExecChainElement.java:51)
	at org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:245)
	at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:188)
	at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(CloseableHttpClient.java:162)
	at name.abuchen.portfolio.util.WebAccess.executeWith(WebAccess.java:294)
	at name.abuchen.portfolio.util.WebAccess.get(WebAccess.java:257)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getJson(GenericJSONQuoteFeed.java:125)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:179)
	... 4 more

Eigene Tests zeigen Folgendes:

  1. Direkter Aufruf mit wget schlägt ebenfalls fehl:
> wget https://www.idealo.de/price-chart/sites/1/products/201491793/history?period=1Y

--2026-01-01 17:19:03--  https://www.idealo.de/price-chart/sites/1/products/201491793/history?period=1Y
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving www.idealo.de (www.idealo.de)... 2.20.143.90, 2.20.143.98, 2.20.143.97, ...
Connecting to www.idealo.de (www.idealo.de)|2.20.143.90|:443... connected.
HTTP request sent, awaiting response...
  1. Ein direkter Aufruf im Browser funktioniert aber!

  2. Nach einigen Tests habe ich ein minimales Beispiel, das ebenfalls funktioniert:

> wget --header="User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0Safari/537.36" --header="X-Requested-With: XMLHttpRequest" https://www.idealo.de/price-chart/sites/1/products/201491793/history?period=1Y

--2026-01-01 17:20:11--  https://www.idealo.de/price-chart/sites/1/products/201491793/history?period=1Y
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving www.idealo.de (www.idealo.de)... 2.20.142.27, 2.20.142.33, 2.20.143.106, ...
Connecting to www.idealo.de (www.idealo.de)|2.20.142.27|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16247 (16K) [application/json]
Saving to: ‘history?period=1Y.2’

history?period=1Y.2                100%[=============================================================>]  15,87K  --.-KB/s    in 0s

2026-01-01 17:20:12 (62,4 MB/s) - ‘history?period=1Y.2’ saved [16247/16247]

Mein Lösungsvorschlag:

Wäre es möglich, in der JSON-Konfiguration ein zusätzliches Feld für eigene Header zu ermöglichen? Damit ließen sich Probleme beim Download von Idealo und ähnlichen Seiten vermeiden. Es sollten mehrere Header möglich sein:

Danke und viele Grüße!