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) {

Reply via email to