From 44c2e55c52312d39b85c0f403df33b1fa764b11a Mon Sep 17 00:00:00 2001 From: Jacse Date: Mon, 5 Jun 2017 19:02:29 +0200 Subject: [PATCH] Android share cookies w/ RN, remove cookie utils --- .../java/com/RNFetchBlob/RNFetchBlob.java | 57 +++++-------- .../java/com/RNFetchBlob/RNFetchBlobReq.java | 15 ++-- .../com/RNFetchBlob/RNFetchBlobUtils.java | 4 +- .../com/RNFetchBlob/Utils/RNFBCookieJar.java | 66 --------------- index.js | 2 - ios/RNFetchBlob/RNFetchBlob.m | 19 ----- ios/RNFetchBlobNetwork.h | 2 - ios/RNFetchBlobNetwork.m | 83 ------------------- net.js | 36 -------- 9 files changed, 27 insertions(+), 257 deletions(-) delete mode 100644 android/src/main/java/com/RNFetchBlob/Utils/RNFBCookieJar.java delete mode 100644 net.js diff --git a/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java b/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java index 88f42ca74..d046f1804 100644 --- a/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java +++ b/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java @@ -3,9 +3,7 @@ import android.app.Activity; import android.content.Intent; import android.net.Uri; -import android.util.Log; -import com.RNFetchBlob.Utils.RNFBCookieJar; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; @@ -15,12 +13,16 @@ import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableMap; + +// Cookies +import com.facebook.react.modules.network.ForwardingCookieHandler; +import com.facebook.react.modules.network.CookieJarContainer; +import com.facebook.react.modules.network.OkHttpClientProvider; +import okhttp3.OkHttpClient; +import okhttp3.JavaNetCookieJar; import java.util.HashMap; import java.util.Map; -import java.util.UUID; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -30,6 +32,11 @@ public class RNFetchBlob extends ReactContextBaseJavaModule { + // Cookies + private final ForwardingCookieHandler mCookieHandler; + private final CookieJarContainer mCookieJarContainer; + private final OkHttpClient mClient; + static ReactApplicationContext RCTContext; static LinkedBlockingQueue taskQueue = new LinkedBlockingQueue<>(); static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 5000, TimeUnit.MILLISECONDS, taskQueue); @@ -42,6 +49,11 @@ public RNFetchBlob(ReactApplicationContext reactContext) { super(reactContext); + mClient = OkHttpClientProvider.getOkHttpClient(); + mCookieHandler = new ForwardingCookieHandler(reactContext); + mCookieJarContainer = (CookieJarContainer) mClient.cookieJar(); + mCookieJarContainer.setCookieJar(new JavaNetCookieJar(mCookieHandler)); + RCTContext = reactContext; reactContext.addActivityEventListener(new ActivityEventListener() { @Override @@ -252,35 +264,6 @@ public void run() { } - @ReactMethod - /** - * Get cookies belongs specific host. - * @param host String domain name. - */ - public void getCookies(String domain, Promise promise) { - try { - WritableMap cookies = RNFBCookieJar.getCookies(domain); - promise.resolve(cookies); - } catch(Exception err) { - promise.reject("RNFetchBlob.getCookies", err.getMessage()); - } - } - - @ReactMethod - /** - * Remove cookies for specific domain - * @param domain String of the domain - * @param promise JSC promise injected by RN - */ - public void removeCookies(String domain, Promise promise) { - try { - RNFBCookieJar.removeCookies(domain); - promise.resolve(null); - } catch(Exception err) { - promise.reject("RNFetchBlob.removeCookies", err.getMessage()); - } - } - @ReactMethod /** * @param path Stream file path @@ -338,12 +321,12 @@ public void enableUploadProgressReport(String taskId, int interval, int count) { @ReactMethod public void fetchBlob(ReadableMap options, String taskId, String method, String url, ReadableMap headers, String body, final Callback callback) { - new RNFetchBlobReq(options, taskId, method, url, headers, body, null, callback).run(); - } + new RNFetchBlobReq(options, taskId, method, url, headers, body, null, mClient, callback).run(); +} @ReactMethod public void fetchBlobForm(ReadableMap options, String taskId, String method, String url, ReadableMap headers, ReadableArray body, final Callback callback) { - new RNFetchBlobReq(options, taskId, method, url, headers, null, body, callback).run(); + new RNFetchBlobReq(options, taskId, method, url, headers, null, body, mClient, callback).run(); } @ReactMethod diff --git a/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java b/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java index 8af663ecf..f01e82efb 100644 --- a/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java +++ b/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java @@ -11,7 +11,6 @@ import com.RNFetchBlob.Response.RNFetchBlobDefaultResp; import com.RNFetchBlob.Response.RNFetchBlobFileResp; -import com.RNFetchBlob.Utils.RNFBCookieJar; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; @@ -21,14 +20,12 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.network.OkHttpClientProvider; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.net.CookieHandler; -import java.net.CookieManager; -import java.net.CookiePolicy; import java.net.MalformedURLException; import java.net.SocketException; import java.net.SocketTimeoutException; @@ -43,7 +40,6 @@ import okhttp3.Call; import okhttp3.ConnectionPool; -import okhttp3.CookieJar; import okhttp3.Headers; import okhttp3.Interceptor; import okhttp3.MediaType; @@ -98,8 +94,9 @@ enum ResponseFormat { WritableMap respInfo; boolean timeout = false; ArrayList redirects = new ArrayList<>(); + OkHttpClient client; - public RNFetchBlobReq(ReadableMap options, String taskId, String method, String url, ReadableMap headers, String body, ReadableArray arrayBody, final Callback callback) { + public RNFetchBlobReq(ReadableMap options, String taskId, String method, String url, ReadableMap headers, String body, ReadableArray arrayBody, OkHttpClient client, final Callback callback) { this.method = method.toUpperCase(); this.options = new RNFetchBlobConfig(options); this.taskId = taskId; @@ -108,6 +105,7 @@ public RNFetchBlobReq(ReadableMap options, String taskId, String method, String this.callback = callback; this.rawRequestBody = body; this.rawRequestBodyArray = arrayBody; + this.client = client; if(this.options.fileCache || this.options.path != null) responseType = ResponseType.FileStorage; @@ -196,7 +194,7 @@ else if(this.options.fileCache) if (this.options.trusty) { clientBuilder = RNFetchBlobUtils.getUnsafeOkHttpClient(); } else { - clientBuilder = new OkHttpClient.Builder(); + clientBuilder = client.newBuilder(); } final Request.Builder builder = new Request.Builder(); @@ -297,10 +295,7 @@ else if(cType.isEmpty()) { } // #156 fix cookie issue - - final Request req = builder.build(); - clientBuilder.cookieJar(new RNFBCookieJar()); clientBuilder.addNetworkInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { diff --git a/android/src/main/java/com/RNFetchBlob/RNFetchBlobUtils.java b/android/src/main/java/com/RNFetchBlob/RNFetchBlobUtils.java index 479bd4a50..6e976d775 100644 --- a/android/src/main/java/com/RNFetchBlob/RNFetchBlobUtils.java +++ b/android/src/main/java/com/RNFetchBlob/RNFetchBlobUtils.java @@ -52,7 +52,7 @@ public static void emitWarningEvent(String data) { .emit(RNFetchBlobConst.EVENT_MESSAGE, args); } - public static OkHttpClient.Builder getUnsafeOkHttpClient() { + public static OkHttpClient.Builder getUnsafeOkHttpClient(OkHttpClient client) { try { // Create a trust manager that does not validate certificate chains final TrustManager[] trustAllCerts = new TrustManager[]{ @@ -78,7 +78,7 @@ public java.security.cert.X509Certificate[] getAcceptedIssuers() { // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - OkHttpClient.Builder builder = new OkHttpClient.Builder(); + OkHttpClient.Builder builder = client.newBuilder(); builder.sslSocketFactory(sslSocketFactory); builder.hostnameVerifier(new HostnameVerifier() { @Override diff --git a/android/src/main/java/com/RNFetchBlob/Utils/RNFBCookieJar.java b/android/src/main/java/com/RNFetchBlob/Utils/RNFBCookieJar.java deleted file mode 100644 index 0075cfa90..000000000 --- a/android/src/main/java/com/RNFetchBlob/Utils/RNFBCookieJar.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.RNFetchBlob.Utils; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableMap; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -import okhttp3.Cookie; -import okhttp3.CookieJar; -import okhttp3.HttpUrl; - -/** - * Created by wkh237on 2016/10/14. - */ - - - -public class RNFBCookieJar implements CookieJar { - - static final HashMap> cookieStore = new HashMap<>(); - private List cookies; - - @Override - public void saveFromResponse(HttpUrl url, List cookies) { - cookieStore.put(url.host(), cookies); - } - - @Override - public List loadForRequest(HttpUrl url) { - List cookies = cookieStore.get(url.host()); - return cookies != null ? cookies : new ArrayList(); - } - - public static void removeCookies(String domain) { - if(domain != null && domain.length() > 0) { - if(cookieStore.containsKey(domain)) - cookieStore.remove(domain); - } - else - cookieStore.clear(); - } - - public static WritableMap getCookies(String host) { - Set domains = cookieStore.keySet(); - WritableMap cookieMap = Arguments.createMap(); - if(host.length() > 0 && cookieStore.containsKey(host)) { - domains.clear(); - domains.add(host); - } - // no domain specified, return all cookies - for(String key : domains) { - WritableArray cookiesInDomain = Arguments.createArray(); - for(Cookie c: cookieStore.get(key)){ - cookiesInDomain.pushString(c.toString()); - } - cookieMap.putArray(key, cookiesInDomain); - } - - return cookieMap; - } -} diff --git a/index.js b/index.js index 0f68fa2e1..cb16b45eb 100644 --- a/index.js +++ b/index.js @@ -25,7 +25,6 @@ import polyfill from './polyfill' import _ from 'lodash' import android from './android' import ios from './ios' -import net from './net' import JSONStream from './json-stream' const { RNFetchBlobSession, @@ -564,7 +563,6 @@ export default { session, fs, wrap, - net, polyfill, JSONStream } diff --git a/ios/RNFetchBlob/RNFetchBlob.m b/ios/RNFetchBlob/RNFetchBlob.m index 4ba969d7b..246d6707c 100644 --- a/ios/RNFetchBlob/RNFetchBlob.m +++ b/ios/RNFetchBlob/RNFetchBlob.m @@ -580,25 +580,6 @@ - (UIViewController *) documentInteractionControllerViewControllerForPreview: (U return window.rootViewController; } -# pragma mark - getCookies - -RCT_EXPORT_METHOD(getCookies:(NSString *)url resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) -{ - resolve([RNFetchBlobNetwork getCookies:url]); -} - -# pragma mark - removeCookie - -RCT_EXPORT_METHOD(removeCookies:(NSString *)domain resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) -{ - NSError * err = nil; - [RNFetchBlobNetwork removeCookies:domain error:&err]; - if(err) - reject(@"RNFetchBlob failed to remove cookie", @"RNFetchBlob failed to remove cookie", nil); - else - resolve(@[[NSNull null]]); -} - # pragma mark - check expired network events RCT_EXPORT_METHOD(emitExpiredEvent:(RCTResponseSenderBlock)callback) diff --git a/ios/RNFetchBlobNetwork.h b/ios/RNFetchBlobNetwork.h index f07f63f1d..d3b4654a5 100644 --- a/ios/RNFetchBlobNetwork.h +++ b/ios/RNFetchBlobNetwork.h @@ -49,10 +49,8 @@ typedef void(^DataTaskCompletionHander) (NSData * _Nullable resp, NSURLResponse - (nullable id) init; - (void) sendRequest; - (void) sendRequest:(NSDictionary * _Nullable )options contentLength:(long)contentLength bridge:(RCTBridge * _Nullable)bridgeRef taskId:(NSString * _Nullable)taskId withRequest:(NSURLRequest * _Nullable)req callback:(_Nullable RCTResponseSenderBlock) callback; -+ (void) removeCookies:(NSString *) domain error:(NSError **)error; + (void) enableProgressReport:(NSString *) taskId config:(RNFetchBlobProgress *)config; + (void) enableUploadProgress:(NSString *) taskId config:(RNFetchBlobProgress *)config; -+ (NSDictionary *) getCookies:(NSString *) url; diff --git a/ios/RNFetchBlobNetwork.m b/ios/RNFetchBlobNetwork.m index 6adbfccfa..85030b743 100644 --- a/ios/RNFetchBlobNetwork.m +++ b/ios/RNFetchBlobNetwork.m @@ -578,89 +578,6 @@ - (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSen } } -# pragma mark - cookies handling API - -+ (NSDictionary *) getCookies:(NSString *) domain -{ - NSMutableDictionary * result = [NSMutableDictionary new]; - NSHTTPCookieStorage * cookieStore = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - for(NSHTTPCookie * cookie in [cookieStore cookies]) - { - NSString * cDomain = [cookie domain]; - if([result objectForKey:cDomain] == nil) - { - [result setObject:[NSMutableArray new] forKey:cDomain]; - } - if([cDomain isEqualToString:domain] || [domain length] == 0) - { - NSMutableString * cookieStr = [[NSMutableString alloc] init]; - cookieStr = [[self class] getCookieString:cookie]; - NSMutableArray * ary = [result objectForKey:cDomain]; - [ary addObject:cookieStr]; - [result setObject:ary forKey:cDomain]; - } - } - return result; -} - -// remove cookies for given domain, if domain is empty remove all cookies in shared cookie storage. -+ (void) removeCookies:(NSString *) domain error:(NSError **)error -{ - @try - { - NSHTTPCookieStorage * cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - for(NSHTTPCookie * cookie in [cookies cookies]) - { - BOOL shouldRemove = domain == nil || [domain length] < 1 || [[cookie domain] isEqualToString:domain]; - if(shouldRemove) - { - [cookies deleteCookie:cookie]; - } - } - } - @catch(NSError * err) - { - *error = err; - } -} - -// convert NSHTTPCookie to string -+ (NSString *) getCookieString:(NSHTTPCookie *) cookie -{ - NSMutableString * cookieStr = [[NSMutableString alloc] init]; - [cookieStr appendString:cookie.name]; - [cookieStr appendString:@"="]; - [cookieStr appendString:cookie.value]; - - if(cookie.expiresDate == nil) { - [cookieStr appendString:@"; max-age=0"]; - } - else { - [cookieStr appendString:@"; expires="]; - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"EEE, dd MM yyyy HH:mm:ss ZZZ"]; - NSString *strDate = [dateFormatter stringFromDate:cookie.expiresDate]; - [cookieStr appendString:strDate]; - } - - - [cookieStr appendString:@"; domain="]; - [cookieStr appendString: [cookie domain]]; - [cookieStr appendString:@"; path="]; - [cookieStr appendString:cookie.path]; - - - if (cookie.isSecure) { - [cookieStr appendString:@"; secure"]; - } - - if (cookie.isHTTPOnly) { - [cookieStr appendString:@"; httponly"]; - } - return cookieStr; - -} - + (void) cancelRequest:(NSString *)taskId { NSURLSessionDataTask * task = [taskTable objectForKey:taskId]; diff --git a/net.js b/net.js deleted file mode 100644 index d48388de5..000000000 --- a/net.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2016 wkh237@github. All rights reserved. -// Use of this source code is governed by a MIT-style license that can be -// found in the LICENSE file. - -import { - NativeModules, - DeviceEventEmitter, - Platform, - NativeAppEventEmitter, -} from 'react-native' - -const RNFetchBlob = NativeModules.RNFetchBlob - -/** - * Get cookie according to the given url. - * @param {string} domain Domain of the cookies to be removed, remove all - * @return {Promise>} Cookies of a specific domain. - */ -function getCookies(domain:string):Promise> { - return RNFetchBlob.getCookies(domain || '') -} - -/** - * Remove cookies for a specific domain - * @param {?string} domain Domain of the cookies to be removed, remove all - * cookies when this is null. - * @return {Promise} - */ -function removeCookies(domain:?string):Promise { - return RNFetchBlob.removeCookies(domain || '') -} - -export default { - getCookies, - removeCookies -}