Skip to content
This repository has been archived by the owner on Sep 26, 2022. It is now read-only.

Commit

Permalink
Fix various cookies issues (#171)
Browse files Browse the repository at this point in the history
* Remove encoding and decoding of cookie values on android to be able to use the format of the Set-Cookie HTTP response header

* Update definitions

* Add clearCookies implementation for android; rename old clearCookies method to clearAllCookies

* Add clearAllCookies implementation for ios

* Fix definitions for cookies map

* Add getCookiesMap implementation for ios
  • Loading branch information
FelixSchwarzmeier authored Nov 10, 2021
1 parent 5ca386c commit a9d986e
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,6 @@ public class CapacitorCookieManager extends CookieManager {

private final android.webkit.CookieManager webkitCookieManager;

private String encode(String value) {
try {
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException ex) {
return "";
}
}

private String decode(String value) {
try {
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException ex) {
return "";
}
}

/**
* Create a new cookie manager for use with @capacitor-community/http with the default cookie
* store and policy
Expand Down Expand Up @@ -97,7 +81,7 @@ public HttpCookie[] getCookies(String url) {
String[] singleCookie = cookieString.split(";");
for (String c : singleCookie) {
HttpCookie parsed = HttpCookie.parse(c).get(0);
parsed.setValue(decode(parsed.getValue()));
parsed.setValue(parsed.getValue());
cookieList.add(parsed);
}
}
Expand Down Expand Up @@ -127,7 +111,7 @@ public void setCookie(String url, String value) {
* @param value the value of the {@code HttpCookie} given a key
*/
public void setCookie(String url, String key, String value) {
String cookieValue = key + "=" + encode(value);
String cookieValue = key + "=" + value;
setCookie(url, cookieValue);
}

Expand Down
12 changes: 12 additions & 0 deletions android/src/main/java/com/getcapacitor/plugin/http/Http.java
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,18 @@ public void deleteCookie(PluginCall call) {

@PluginMethod
public void clearCookies(PluginCall call) {
String url = getServerUrl(call);
if (!url.isEmpty()) {
HttpCookie[] cookies = cookieManager.getCookies(url);
for (HttpCookie cookie : cookies) {
cookieManager.setCookie(url, cookie.getName() + "=; Expires=Wed, 31 Dec 2000 23:59:59 GMT");
}
call.resolve();
}
}

@PluginMethod
public void clearAllCookies(PluginCall call) {
cookieManager.removeAllCookies();
call.resolve();
}
Expand Down
5 changes: 5 additions & 0 deletions ios/Plugin/CapacitorCookieManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,9 @@ public class CapacitorCookieManager {
let jar = HTTPCookieStorage.shared
jar.cookies(for: url)?.forEach({ (cookie) in jar.deleteCookie(cookie) })
}

public func clearAllCookies() {
let jar = HTTPCookieStorage.shared
jar.cookies?.forEach({ (cookie) in jar.deleteCookie(cookie) })
}
}
2 changes: 2 additions & 0 deletions ios/Plugin/Plugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
CAP_PLUGIN_METHOD(patch, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(del, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(setCookie, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(getCookiesMap, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(getCookies, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(getCookie, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(deleteCookie, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(clearCookies, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(clearAllCookies, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(downloadFile, CAPPluginReturnPromise);
CAP_PLUGIN_METHOD(uploadFile, CAPPluginReturnPromise);
)
20 changes: 18 additions & 2 deletions ios/Plugin/Plugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,18 @@ import Foundation
call.resolve()
}
}

@objc func getCookiesMap(_ call: CAPPluginCall) {
let url = getServerUrl(call)
if url != nil {
let cookies = cookieManager!.getCookies(url!)
var cookiesMap: [String: String] = [:]
for cookie in cookies {
cookiesMap[cookie.name] = cookie.value
}
call.resolve(cookiesMap)
}
}

@objc func getCookies(_ call: CAPPluginCall) {
let url = getServerUrl(call)
Expand Down Expand Up @@ -154,9 +166,13 @@ import Foundation
@objc func clearCookies(_ call: CAPPluginCall) {
let url = getServerUrl(call)
if url != nil {
let jar = HTTPCookieStorage.shared
jar.cookies(for: url!)?.forEach({ (cookie) in jar.deleteCookie(cookie) })
cookieManager!.clearCookies(url!)
call.resolve()
}
}

@objc func clearAllCookies(_ call: CAPPluginCall) {
cookieManager!.clearAllCookies()
call.resolve()
}
}
3 changes: 2 additions & 1 deletion src/definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ export interface HttpPlugin {
setCookie(options: HttpSetCookieOptions): Promise<void>;
getCookie(options: HttpSingleCookieOptions): Promise<HttpCookie>;
getCookies(options: HttpMultiCookiesOptions): Promise<HttpGetCookiesResult>;
getCookiesMap(): Promise<HttpCookieMap>;
getCookiesMap(options: HttpMultiCookiesOptions): Promise<HttpCookieMap>;
clearCookies(options: HttpMultiCookiesOptions): Promise<void>;
clearAllCookies(): Promise<void>;
deleteCookie(options: HttpSingleCookieOptions): Promise<void>;

uploadFile(options: HttpUploadFileOptions): Promise<HttpUploadFileResult>;
Expand Down
10 changes: 9 additions & 1 deletion src/web.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@ export class HttpWeb extends WebPlugin implements HttpPlugin {
/**
* Gets all HttpCookies as a Map
*/
public getCookiesMap = async (): Promise<HttpCookieMap> => {
public getCookiesMap = async (
// @ts-ignore
options: HttpMultiCookiesOptions,
): Promise<HttpCookieMap> => {
const cookies = Cookie.getCookies();
const output: HttpCookieMap = {};

Expand Down Expand Up @@ -127,6 +130,11 @@ export class HttpWeb extends WebPlugin implements HttpPlugin {
options: HttpMultiCookiesOptions,
): Promise<void> => Cookie.clearCookies();

/**
* Clears out cookies by setting them to expire immediately
*/
public clearAllCookies = async (): Promise<void> => Cookie.clearCookies();

/**
* Uploads a file through a POST request
* @param options TODO
Expand Down

0 comments on commit a9d986e

Please sign in to comment.