CAMEL-10238: Restore Cookies and HOST headers in securityhandler for 
subscriptions


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/54c78e5c
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/54c78e5c
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/54c78e5c

Branch: refs/heads/master
Commit: 54c78e5c516b0dd81648c76049b13ed476e89f7c
Parents: c5b6f9b
Author: Dhiraj Bokde <dhira...@yahoo.com>
Authored: Thu Aug 25 00:28:58 2016 -0700
Committer: Dhiraj Bokde <dhira...@yahoo.com>
Committed: Thu Aug 25 01:20:42 2016 -0700

----------------------------------------------------------------------
 .../client/SalesforceSecurityHandler.java       | 36 ++++++++++++++------
 1 file changed, 25 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/54c78e5c/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java
----------------------------------------------------------------------
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java
index 679cb1c..fc11fe9 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/client/SalesforceSecurityHandler.java
@@ -30,6 +30,8 @@ import org.eclipse.jetty.client.api.Request;
 import org.eclipse.jetty.client.api.Response;
 import org.eclipse.jetty.client.api.Result;
 import org.eclipse.jetty.client.util.BufferingResponseListener;
+import org.eclipse.jetty.http.HttpField;
+import org.eclipse.jetty.http.HttpFields;
 import org.eclipse.jetty.http.HttpHeader;
 import org.eclipse.jetty.http.HttpStatus;
 import org.slf4j.Logger;
@@ -208,24 +210,36 @@ public class SalesforceSecurityHandler implements 
ProtocolHandler {
             if (copy) {
                 newRequest = httpClient.copyRequest(request, request.getURI());
                 newRequest.method(request.getMethod());
+                HttpFields headers = newRequest.getHeaders();
+                // copy cookies and host for subscriptions to avoid 
'403::Unknown Client' errors
+                for (HttpField field : request.getHeaders()) {
+                    HttpHeader header = field.getHeader();
+                    if (HttpHeader.COOKIE.equals(header) || 
HttpHeader.HOST.equals(header)) {
+                        headers.add(header, field.getValue());
+                    }
+                }
             } else {
                 newRequest = request;
             }
 
             conversation.setAttribute(AUTHENTICATION_RETRIES_ATTRIBUTE, 
++retries);
 
-            LOG.debug("Retry attempt {} on authentication error for {}", 
retries, request);
+            Object originalRequest = 
conversation.getAttribute(AUTHENTICATION_REQUEST_ATTRIBUTE);
+            LOG.debug("Retry attempt {} on authentication error for {}", 
retries, originalRequest != null ? originalRequest : newRequest);
 
-            // update currentToken
-            String currentToken = session.getAccessToken();
-            if (client != null) {
-                // update client cache for this and future requests
-                client.setAccessToken(currentToken);
-                client.setInstanceUrl(session.getInstanceUrl());
-                client.setAccessToken(newRequest);
-            } else {
-                // plain request not made by an AbstractClientBase
-                newRequest.header(HttpHeader.AUTHORIZATION, "OAuth " + 
currentToken);
+            // update currentToken for original request
+            if (originalRequest == null) {
+
+                String currentToken = session.getAccessToken();
+                if (client != null) {
+                    // update client cache for this and future requests
+                    client.setAccessToken(currentToken);
+                    client.setInstanceUrl(session.getInstanceUrl());
+                    client.setAccessToken(newRequest);
+                } else {
+                    // plain request not made by an AbstractClientBase
+                    newRequest.header(HttpHeader.AUTHORIZATION, "OAuth " + 
currentToken);
+                }
             }
 
             // send new async request with a new delegate

Reply via email to