summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Peter Christen <mc@yacy.net>2026-01-03 01:56:45 +0100
committerMichael Peter Christen <mc@yacy.net>2026-01-03 01:56:45 +0100
commit076a2d1e02c9777ba48537edc1f7e1aa3c9cc60d (patch)
treef7bd4d306f324a18ff6d42e075a4c1b33c799b2a
parent2819742bdb053feb7057661748cc7af7dd725ff7 (diff)
Handle POST redirects when contacting peers, fix for
https://github.com/yacy/yacy_search_server/issues/684 YaCy’s peer queries use HTTP POST and were not following redirects, so HTTP→HTTPS redirections (e.g., 8090→8443) failed and peers never switched protocol/port. This adds a redirect strategy that allows POST redirects (preserving method/body, except for 303), letting remote peer connections follow HTTPS redirects correctly.
-rw-r--r--source/net/yacy/cora/protocol/http/HTTPClient.java26
1 files changed, 26 insertions, 0 deletions
diff --git a/source/net/yacy/cora/protocol/http/HTTPClient.java b/source/net/yacy/cora/protocol/http/HTTPClient.java
index 4c34a89df..cc4cbcabc 100644
--- a/source/net/yacy/cora/protocol/http/HTTPClient.java
+++ b/source/net/yacy/cora/protocol/http/HTTPClient.java
@@ -29,6 +29,7 @@ import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.URI;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
@@ -57,6 +58,7 @@ import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.auth.AuthSchemeProvider;
@@ -72,6 +74,7 @@ import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.config.Lookup;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
@@ -88,10 +91,12 @@ import org.apache.http.impl.auth.BasicSchemeFactory;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.IdleConnectionEvictor;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ProtocolException;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.ByteArrayBuffer;
@@ -220,6 +225,7 @@ public class HTTPClient implements Closeable {
builder.setConnectionManager(CONNECTION_MANAGER);
builder.setConnectionManagerShared(true);
builder.setDefaultRequestConfig(DFLTREQUESTCONFIG);
+ builder.setRedirectStrategy(new YaCyRedirectStrategy());
builder.setUserAgent(ClientIdentification.yacyInternetCrawlerAgent.userAgent());
builder.setDefaultCookieStore(new BasicCookieStore());
@@ -275,6 +281,26 @@ public class HTTPClient implements Closeable {
return pooling;
}
+ private static final class YaCyRedirectStrategy extends DefaultRedirectStrategy {
+ @Override
+ protected boolean isRedirectable(final String method) {
+ return true;
+ }
+
+ @Override
+ public HttpUriRequest getRedirect(
+ final HttpRequest request,
+ final HttpResponse response,
+ final HttpContext context) throws ProtocolException {
+ final URI uri = getLocationURI(request, response, context);
+ final int status = response.getStatusLine().getStatusCode();
+ if (status == HttpStatus.SC_SEE_OTHER) {
+ return new HttpGet(uri);
+ }
+ return RequestBuilder.copy(request).setUri(uri).build();
+ }
+ }
+
/**
* Initialize the maximum connections for the given pool
*