diff --git a/src/main/java/com/couchbase/lite/replicator/Replication.java b/src/main/java/com/couchbase/lite/replicator/Replication.java index c90c9e3e..80e1b39c 100644 --- a/src/main/java/com/couchbase/lite/replicator/Replication.java +++ b/src/main/java/com/couchbase/lite/replicator/Replication.java @@ -42,6 +42,9 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import okhttp3.Cookie; +import okhttp3.HttpUrl; + /** * The external facade for the Replication API */ @@ -916,10 +919,35 @@ public Map getFilterParams() { */ @InterfaceAudience.Public public void setHeaders(Map requestHeadersParam) { + // Fix - https://github.com/couchbase/couchbase-lite-java-core/issues/1617 + storeCookiesIntoCookieJar(requestHeadersParam); + properties.put(ReplicationField.REQUEST_HEADERS, requestHeadersParam); replicationInternal.setHeaders(requestHeadersParam); } + private void storeCookiesIntoCookieJar(Map requestHeadersParam) { + try { + if (requestHeadersParam != null + && requestHeadersParam.containsKey("Cookie") + && requestHeadersParam.get("Cookie") instanceof String) { + String cookieString = (String) requestHeadersParam.get("Cookie"); + if (remote != null) { + // NOTE: In case that the path of URL is not end with `/`, + // last segment of a path is not stored as a path of Cookie. + Cookie cookie = Cookie.parse(HttpUrl.get(remote), cookieString); + if (cookie != null) { + replicationInternal.setCookie(cookie); + // remove Cookie value from requestHeadersParam if cookie is successfully stored into the cookie jar. + requestHeadersParam.remove("Cookie"); + } + } + } + } catch (Exception e) { + Log.e(Log.TAG_SYNC, "Failed to store SyncGatewaySession into the CookieJar.", e); + } + } + /** * Extra HTTP headers to send in all requests to the remote server. * Should map strings (header names) to strings. diff --git a/src/main/java/com/couchbase/lite/replicator/ReplicationInternal.java b/src/main/java/com/couchbase/lite/replicator/ReplicationInternal.java index e3878c09..9d29d514 100644 --- a/src/main/java/com/couchbase/lite/replicator/ReplicationInternal.java +++ b/src/main/java/com/couchbase/lite/replicator/ReplicationInternal.java @@ -14,7 +14,6 @@ package com.couchbase.lite.replicator; import com.couchbase.lite.AsyncTask; -import com.couchbase.lite.CouchbaseLiteException; import com.couchbase.lite.Database; import com.couchbase.lite.Misc; import com.couchbase.lite.ReplicationFilter; @@ -1807,6 +1806,12 @@ public void setCookie(String name, String value, String path, Date expirationDat this.clientFactory.addCookies(cookies); } + public void setCookie(Cookie cookie) { + if (cookie == null) + return; + this.clientFactory.addCookies(Collections.singletonList(cookie)); + } + /** * For java docs, see Replication.deleteCookie() */