This is an automated email from the ASF dual-hosted git repository. dsmiley pushed a commit to branch branch_10x in repository https://gitbox.apache.org/repos/asf/solr.git
commit 11f2b53b10368e269b77fa76f84f950a6f597c01 Author: wildtusker <[email protected]> AuthorDate: Mon Jun 8 20:21:56 2026 +0530 SOLR-17810 : Jetty & Jdk SolrClient requests should be recognized by rate limiter (#4282) Co-authored-by: David Smiley <[email protected]> --- changelog/unreleased/SOLR-17810.yml | 9 +++++++++ .../solr/client/solrj/jetty/HttpJettySolrClient.java | 20 ++++++++++++++------ .../org/apache/solr/client/solrj/SolrClient.java | 1 + .../solr/client/solrj/impl/HttpJdkSolrClient.java | 11 ++++++++--- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/changelog/unreleased/SOLR-17810.yml b/changelog/unreleased/SOLR-17810.yml new file mode 100644 index 00000000000..c38fbcae50d --- /dev/null +++ b/changelog/unreleased/SOLR-17810.yml @@ -0,0 +1,9 @@ +title: > + HttpJdkSolrClient & HttpJettySolrClient now send headers that enable Solr's rate limiting to work. +type: changed +authors: + - name: David Smiley + - name: Gaurav Tuli +links: + - name: SOLR-17810 + url: https://issues.apache.org/jira/browse/SOLR-17810 diff --git a/solr/solrj-jetty/src/java/org/apache/solr/client/solrj/jetty/HttpJettySolrClient.java b/solr/solrj-jetty/src/java/org/apache/solr/client/solrj/jetty/HttpJettySolrClient.java index 46f0a23aec6..d0d8e034c22 100644 --- a/solr/solrj-jetty/src/java/org/apache/solr/client/solrj/jetty/HttpJettySolrClient.java +++ b/solr/solrj-jetty/src/java/org/apache/solr/client/solrj/jetty/HttpJettySolrClient.java @@ -50,6 +50,7 @@ import org.apache.solr.client.solrj.jetty.HttpListenerFactory.RequestResponseLis import org.apache.solr.client.solrj.request.RequestWriter; import org.apache.solr.client.solrj.response.ResponseParser; import org.apache.solr.client.solrj.util.ClientUtils; +import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.EnvUtils; @@ -620,7 +621,19 @@ public class HttpJettySolrClient extends HttpSolrClient { } protected void decorateRequest(Request req, SolrRequest<?> solrRequest, boolean isAsync) { - req.headers(headers -> headers.remove(HttpHeader.ACCEPT_ENCODING)); + req.headers(h -> h.remove(HttpHeader.ACCEPT_ENCODING)); + Map<String, String> customHeaders = solrRequest.getHeaders(); + if (customHeaders != null) { + req.headers(h -> customHeaders.forEach(h::add)); + } + // note: if subsequent headers already added, the existing values win (first value considered) + req.headers( + h -> { + h.add(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString()); + // TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720 + h.add(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString()); + }); + req.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS); req.timeout(requestTimeoutMillis, TimeUnit.MILLISECONDS); @@ -640,11 +653,6 @@ public class HttpJettySolrClient extends HttpSolrClient { req.onRequestQueued(asyncTracker.queuedListener); req.onComplete(asyncTracker.completeListener); } - - Map<String, String> headers = solrRequest.getHeaders(); - if (headers != null) { - req.headers(h -> headers.forEach(h::add)); - } } private static class MakeRequestReturnValue { diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java index 4512eaaa7d8..e83ce93f7a5 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java @@ -1199,6 +1199,7 @@ public abstract class SolrClient implements Serializable, Closeable { * communication between Solr nodes or as an external client). The default value is {@code * SolrClientContext#Client} */ + @Deprecated(since = "10.1") // TODO replace or refactor; see SOLR-14720 related public SolrRequest.SolrClientContext getContext() { return SolrRequest.SolrClientContext.CLIENT; } diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java index 502637e026f..5489cac7058 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java @@ -56,6 +56,7 @@ import org.apache.solr.client.solrj.request.RequestWriter; import org.apache.solr.client.solrj.response.ResponseParser; import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.ExecutorUtil; @@ -451,14 +452,18 @@ public class HttpJdkSolrClient extends HttpSolrClient { private void decorateRequest(HttpRequest.Builder reqb, SolrRequest<?> solrRequest) { reqb.timeout(Duration.of(requestTimeoutMillis, ChronoUnit.MILLIS)); + reqb.header("User-Agent", USER_AGENT); setBasicAuthHeader(solrRequest, reqb); - Map<String, String> headers = solrRequest.getHeaders(); - if (headers != null) { - for (Map.Entry<String, String> entry : headers.entrySet()) { + Map<String, String> customHeaders = solrRequest.getHeaders(); + if (customHeaders != null) { + for (Map.Entry<String, String> entry : customHeaders.entrySet()) { reqb.header(entry.getKey(), entry.getValue()); } } + reqb.header(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString()); + // TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720 + reqb.header(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString()); } private void setBasicAuthHeader(SolrRequest<?> solrRequest, HttpRequest.Builder reqb) {
