diff --git a/android/src/main/java/com/getcapacitor/plugin/http/CapacitorCookieManager.java b/android/src/main/java/com/getcapacitor/plugin/http/CapacitorCookieManager.java index 578abe46..fd2a1275 100644 --- a/android/src/main/java/com/getcapacitor/plugin/http/CapacitorCookieManager.java +++ b/android/src/main/java/com/getcapacitor/plugin/http/CapacitorCookieManager.java @@ -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 @@ -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); } } @@ -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); } diff --git a/android/src/main/java/com/getcapacitor/plugin/http/Http.java b/android/src/main/java/com/getcapacitor/plugin/http/Http.java index c2025cf1..afae2ead 100644 --- a/android/src/main/java/com/getcapacitor/plugin/http/Http.java +++ b/android/src/main/java/com/getcapacitor/plugin/http/Http.java @@ -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(); } diff --git a/ios/Plugin/CapacitorCookieManager.swift b/ios/Plugin/CapacitorCookieManager.swift index 8560e52b..dbc96585 100644 --- a/ios/Plugin/CapacitorCookieManager.swift +++ b/ios/Plugin/CapacitorCookieManager.swift @@ -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) }) + } } diff --git a/ios/Plugin/Plugin.m b/ios/Plugin/Plugin.m index 4fd50e9d..8db36413 100644 --- a/ios/Plugin/Plugin.m +++ b/ios/Plugin/Plugin.m @@ -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); ) diff --git a/ios/Plugin/Plugin.swift b/ios/Plugin/Plugin.swift index 6d8ac74b..d06365c3 100644 --- a/ios/Plugin/Plugin.swift +++ b/ios/Plugin/Plugin.swift @@ -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) @@ -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() + } } diff --git a/src/definitions.ts b/src/definitions.ts index 5d182981..649cc088 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -14,8 +14,9 @@ export interface HttpPlugin { setCookie(options: HttpSetCookieOptions): Promise; getCookie(options: HttpSingleCookieOptions): Promise; getCookies(options: HttpMultiCookiesOptions): Promise; - getCookiesMap(): Promise; + getCookiesMap(options: HttpMultiCookiesOptions): Promise; clearCookies(options: HttpMultiCookiesOptions): Promise; + clearAllCookies(): Promise; deleteCookie(options: HttpSingleCookieOptions): Promise; uploadFile(options: HttpUploadFileOptions): Promise; diff --git a/src/web.ts b/src/web.ts index 9258e9f7..50ef37e3 100644 --- a/src/web.ts +++ b/src/web.ts @@ -68,7 +68,10 @@ export class HttpWeb extends WebPlugin implements HttpPlugin { /** * Gets all HttpCookies as a Map */ - public getCookiesMap = async (): Promise => { + public getCookiesMap = async ( + // @ts-ignore + options: HttpMultiCookiesOptions, + ): Promise => { const cookies = Cookie.getCookies(); const output: HttpCookieMap = {}; @@ -127,6 +130,11 @@ export class HttpWeb extends WebPlugin implements HttpPlugin { options: HttpMultiCookiesOptions, ): Promise => Cookie.clearCookies(); + /** + * Clears out cookies by setting them to expire immediately + */ + public clearAllCookies = async (): Promise => Cookie.clearCookies(); + /** * Uploads a file through a POST request * @param options TODO