This is an automated email from the ASF dual-hosted git repository. dsmiley pushed a commit to branch branch_9x in repository https://gitbox.apache.org/repos/asf/solr.git
commit 95fc6207ff366b860aa03faf1c71ea9eb552f50b Author: wildtusker <[email protected]> AuthorDate: Mon Jun 8 10:51:56 2026 -0400 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 +++++++++ .../java/org/apache/solr/client/solrj/SolrClient.java | 1 + .../solr/client/solrj/impl/Http2SolrClient.java | 19 +++++++++++++------ .../solr/client/solrj/impl/HttpJdkSolrClient.java | 11 ++++++++--- 4 files changed, 31 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/src/java/org/apache/solr/client/solrj/SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java index 7bdd6b27ca6..5bddd55e301 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 @@ -1213,6 +1213,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/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java index ad014b6a0e0..1edc98067ba 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java @@ -57,6 +57,7 @@ import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.client.solrj.util.AsyncListener; import org.apache.solr.client.solrj.util.Cancellable; 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.params.SolrParams; import org.apache.solr.common.params.UpdateParams; @@ -736,7 +737,18 @@ public class Http2SolrClient extends HttpSolrClientBase { } private 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); @@ -756,11 +768,6 @@ public class Http2SolrClient extends HttpSolrClientBase { 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 SolrRequest<?> unwrapV2Request(SolrRequest<?> solrRequest) { 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 78b5bf18d28..16f2ed456c7 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 @@ -57,6 +57,7 @@ import org.apache.solr.client.solrj.util.AsyncListener; import org.apache.solr.client.solrj.util.Cancellable; 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; @@ -449,14 +450,18 @@ public class HttpJdkSolrClient extends HttpSolrClientBase { 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) {
