You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2010/11/30 17:59:13 UTC
svn commit: r1040643 - in /cxf/branches/2.2.x-fixes: ./
rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
Author: dkulp
Date: Tue Nov 30 16:59:12 2010
New Revision: 1040643
URL: http://svn.apache.org/viewvc?rev=1040643&view=rev
Log:
Merged revisions 1040640 via svnmerge from
https://svn.apache.org/repos/asf/cxf/branches/2.3.x-fixes
................
r1040640 | dkulp | 2010-11-30 11:49:16 -0500 (Tue, 30 Nov 2010) | 9 lines
Merged revisions 1040635 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1040635 | dkulp | 2010-11-30 11:45:34 -0500 (Tue, 30 Nov 2010) | 1 line
[CXF-3100] Add cookies on retransmit
........
................
Modified:
cxf/branches/2.2.x-fixes/ (props changed)
cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java?rev=1040643&r1=1040642&r2=1040643&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java (original)
+++ cxf/branches/2.2.x-fixes/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java Tue Nov 30 16:59:12 2010
@@ -646,24 +646,7 @@ public class HTTPConduit
maintainSession = Boolean.TRUE.equals((Boolean)message.get(Message.MAINTAIN_SESSION));
//If we have any cookies and we are maintaining sessions, then use them
- if (maintainSession && sessionCookies.size() > 0) {
- List<String> cookies = null;
- for (String s : headers.keySet()) {
- if (HttpHeaderHelper.COOKIE.equalsIgnoreCase(s)) {
- cookies = headers.remove(s);
- break;
- }
- }
- if (cookies == null) {
- cookies = new ArrayList<String>();
- } else {
- cookies = new ArrayList<String>(cookies);
- }
- headers.put(HttpHeaderHelper.COOKIE, cookies);
- for (Cookie c : sessionCookies.values()) {
- cookies.add(c.requestCookieHeader());
- }
- }
+ addCookieHeadersToRequest(headers);
// The trust decision is relegated to after the "flushing" of the
// request headers.
@@ -693,6 +676,7 @@ public class HTTPConduit
}
public void close(Message msg) throws IOException {
+
InputStream in = msg.getContent(InputStream.class);
try {
if (in != null) {
@@ -805,6 +789,7 @@ public class HTTPConduit
* @throws MalformedURLException
*/
private URL setupURL(Message message) throws MalformedURLException {
+
String result = (String)message.get(Message.ENDPOINT_ADDRESS);
String pathInfo = (String)message.get(Message.PATH_INFO);
String queryString = (String)message.get(Message.QUERY_STRING);
@@ -1736,7 +1721,6 @@ public class HTTPConduit
// which must have been wrong, or we wouldn't be here again.
// Otherwise, the server may be 401 looping us around the realms.
if (authURLs.contains(currentURL.toString() + realm)) {
-
if (LOG.isLoggable(Level.INFO)) {
LOG.log(Level.INFO, "Authorization loop detected on Conduit \""
+ getConduitName()
@@ -1769,6 +1753,10 @@ public class HTTPConduit
Map<String, List<String>> headers = getSetProtocolHeaders(message);
headers.put("Authorization",
createMutableList(up));
+
+ // also adding cookie headers when retransmitting in case of a "401 Unauthorized" response
+ addCookieHeadersToRequest(headers);
+
return retransmit(
connection, currentURL, message, cachedStream);
}
@@ -1952,6 +1940,34 @@ public class HTTPConduit
headers.put("Proxy-Authorization",
createMutableList("Basic " + token));
}
+
+ /**
+ * This method adds the cookie-headers to the request.
+ *
+ * @param headers die Header des Requests
+ */
+ private void addCookieHeadersToRequest(Map<String, List<String>> headers) {
+ //If we have any cookies and we are maintaining sessions, then use them
+ if (maintainSession && sessionCookies.size() > 0) {
+ List<String> cookies = null;
+ for (String s : headers.keySet()) {
+ if (HttpHeaderHelper.COOKIE.equalsIgnoreCase(s)) {
+ cookies = headers.remove(s);
+ break;
+ }
+ }
+ if (cookies == null) {
+ cookies = new ArrayList<String>();
+ } else {
+ cookies = new ArrayList<String>(cookies);
+ }
+ headers.put(HttpHeaderHelper.COOKIE, cookies);
+ for (Cookie c : sessionCookies.values()) {
+ cookies.add(c.requestCookieHeader());
+ }
+ }
+ }
+
/**
* Wrapper output stream responsible for flushing headers and handling
@@ -1974,6 +1990,7 @@ public class HTTPConduit
*/
protected final boolean chunking;
+
/**
* This field contains the output stream with which we cache
* the request. It maybe null if we are not caching.
@@ -2205,6 +2222,15 @@ public class HTTPConduit
int maxRetransmits = (policy == null)
? -1
: policy.getMaxRetransmits();
+
+ // evaluate "Set-Cookie" headers before handling retransmits
+ if (maintainSession) {
+ for (Map.Entry<String, List<String>> h : connection.getHeaderFields().entrySet()) {
+ if ("Set-Cookie".equalsIgnoreCase(h.getKey())) {
+ Cookie.handleSetCookie(sessionCookies, h.getValue());
+ }
+ }
+ }
// MaxRetransmits of zero means zero.
if (maxRetransmits == 0) {