From cb4d5f60161a3305d64e757fb89b25ce1ca35378 Mon Sep 17 00:00:00 2001 From: Marc Mendiola Date: Tue, 19 Apr 2016 18:01:12 -0700 Subject: [PATCH 1/4] Add support for post requests --- Downloader.h | 2 ++ Downloader.m | 9 +++++++-- FS.common.js | 7 +++---- RNFSManager.m | 4 ++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Downloader.h b/Downloader.h index 89d96aac..b0940045 100644 --- a/Downloader.h +++ b/Downloader.h @@ -9,6 +9,8 @@ typedef void (^ProgressCallback)(NSNumber*, NSNumber*); @property (copy) NSString* fromUrl; @property (copy) NSString* toFile; +@property (copy) NSString* method; +@property (copy) NSString* postString; @property (copy) DownloaderCallback callback; // Download has finished (data written) @property (copy) ErrorCallback errorCallback; // Something went wrong @property (copy) BeginCallback beginCallback; // Download has started (headers received) diff --git a/Downloader.m b/Downloader.m index 8b3d30fc..bcfa191e 100644 --- a/Downloader.m +++ b/Downloader.m @@ -22,7 +22,7 @@ @implementation Downloader - (void)downloadFile:(DownloadParams*)params { _params = params; - + _bytesWritten = 0; NSURL* url = [NSURL URLWithString:_params.fromUrl]; @@ -30,6 +30,11 @@ - (void)downloadFile:(DownloadParams*)params NSMutableURLRequest* downloadRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30]; + if ([_params.method isEqualToString: @"POST"]) { + [downloadRequest setHTTPMethod:_params.method]; + NSString *postString = _params.postString; + [downloadRequest setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; + } [[NSFileManager defaultManager] createFileAtPath:_params.toFile contents:nil attributes:nil]; @@ -61,7 +66,7 @@ - (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLRespons _statusCode = [NSNumber numberWithLong:httpUrlResponse.statusCode]; _contentLength = [NSNumber numberWithLong: httpUrlResponse.expectedContentLength]; - + return _params.beginCallback(_statusCode, _contentLength, httpUrlResponse.allHeaderFields); } diff --git a/FS.common.js b/FS.common.js index 074cdf41..a056c924 100644 --- a/FS.common.js +++ b/FS.common.js @@ -83,7 +83,7 @@ var RNFS = { }) .catch(convertError); }, - + exists(filepath) { return _exists(filepath) .catch(convertError); @@ -150,7 +150,7 @@ var RNFS = { .catch(convertError); }, - downloadFile(fromUrl, toFile, begin, progress) { + downloadFile(fromUrl, toFile, method = 'GET', paramString = '', begin, progress) { var jobId = getJobId(); var subscriptionIos, subscriptionAndroid; @@ -173,7 +173,7 @@ var RNFS = { subscriptionAndroid = DeviceEventEmitter.addListener('DownloadProgress-' + jobId, progress); } - return _downloadFile(fromUrl, toFile, jobId) + return _downloadFile(fromUrl, toFile, method, paramString, jobId) .then(res => { if (subscriptionIos) subscriptionIos.remove(); if (subscriptionAndroid) subscriptionAndroid.remove(); @@ -189,7 +189,6 @@ var RNFS = { MainBundlePath: RNFSManager.MainBundlePath, CachesDirectoryPath: RNFSManager.NSCachesDirectoryPath, DocumentDirectoryPath: RNFSManager.NSDocumentDirectoryPath, - ExternalDirectoryPath: RNFSManager.NSExternalDirectoryPath, LibraryDirectoryPath: RNFSManager.NSLibraryDirectoryPath, PicturesDirectoryPath: RNFSManager.NSPicturesDirectoryPath }; diff --git a/RNFSManager.m b/RNFSManager.m index ca8cfcb8..8943f297 100644 --- a/RNFSManager.m +++ b/RNFSManager.m @@ -174,6 +174,8 @@ - (dispatch_queue_t)methodQueue RCT_EXPORT_METHOD(downloadFile:(NSString *)urlStr filepath:(NSString *)filepath + method:(NSString *)method + postString:(NSString *)postString jobId:(nonnull NSNumber *)jobId callback:(RCTResponseSenderBlock)callback) { @@ -182,6 +184,8 @@ - (dispatch_queue_t)methodQueue params.fromUrl = urlStr; params.toFile = filepath; + params.method = method; + params.postString = postString; params.callback = ^(NSNumber* statusCode, NSNumber* bytesWritten) { NSMutableDictionary* result = [[NSMutableDictionary alloc] initWithDictionary: @{@"jobId": jobId, From 2298edd6e92959a579b4479f05d26384edc8432c Mon Sep 17 00:00:00 2001 From: Marc Mendiola Date: Wed, 20 Apr 2016 14:40:02 -0700 Subject: [PATCH 2/4] Make url ref iodine fork --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6065be92..a704120f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git@github.com:johanneslumpe/react-native-fs.git" + "url": "git@github.com:iodine/react-native-fs.git" }, "keywords": [ "react-component", From 3945d88804f48d1632de9f105a50f667e7d6e1ff Mon Sep 17 00:00:00 2001 From: Marc Mendiola Date: Sat, 8 Oct 2016 11:31:25 -0700 Subject: [PATCH 3/4] Add support for POST request for Android --- .../main/java/com/rnfs/DownloadParams.java | 8 ++- .../src/main/java/com/rnfs/Downloader.java | 70 ++++++++++++++++++- .../src/main/java/com/rnfs/RNFSManager.java | 4 +- 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/rnfs/DownloadParams.java b/android/src/main/java/com/rnfs/DownloadParams.java index 510a9a87..f78bb5b7 100644 --- a/android/src/main/java/com/rnfs/DownloadParams.java +++ b/android/src/main/java/com/rnfs/DownloadParams.java @@ -12,14 +12,16 @@ public interface OnTaskCompleted { public interface OnDownloadBegin { void onDownloadBegin(int statusCode, int contentLength, Map headers); } - + public interface OnDownloadProgress { void onDownloadProgress(int contentLength, int bytesWritten); } - + public URL src; public File dest; + public String method; + public String postString; public OnTaskCompleted onTaskCompleted; public OnDownloadBegin onDownloadBegin; public OnDownloadProgress onDownloadProgress; -} \ No newline at end of file +} diff --git a/android/src/main/java/com/rnfs/Downloader.java b/android/src/main/java/com/rnfs/Downloader.java index 3c36736d..fb4e5497 100644 --- a/android/src/main/java/com/rnfs/Downloader.java +++ b/android/src/main/java/com/rnfs/Downloader.java @@ -37,13 +37,20 @@ protected DownloadResult doInBackground(DownloadParams... params) { } private void download(DownloadParams param, DownloadResult res) throws IOException { + if (param.method.equals("POST")) { + this.downloadViaPost(param, res); + } else { + this.downloadViaGet(param, res); + } + } + + private void downloadViaGet(DownloadParams param, DownloadResult res) throws IOException { InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { connection = (HttpURLConnection)param.src.openConnection(); - connection.setConnectTimeout(5000); connection.connect(); @@ -57,7 +64,7 @@ private void download(DownloadParams param, DownloadResult res) throws IOExcepti for (Map.Entry> entry : headers.entrySet()) { String headerKey = entry.getKey(); String valueKey = entry.getValue().get(0); - + if (headerKey != null && valueKey != null) { headersFlat.put(headerKey, valueKey); } @@ -93,6 +100,65 @@ private void download(DownloadParams param, DownloadResult res) throws IOExcepti } } + private void downloadViaPost(DownloadParams param, DownloadResult res) throws IOException { + InputStream input = null; + OutputStream output = null; + HttpURLConnection connection = null; + + try { + connection = (HttpURLConnection)param.src.openConnection(); + connection.setConnectTimeout(5000); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + + DataOutputStream wr = new DataOutputStream(connectio.getOutputStream()); + wr.writeBytes(param.postString); + wr.flush(); + wr.close(); + + int statusCode = connection.getResponseCode(); + int lengthOfFile = connection.getContentLength(); + + Map> headers = connection.getHeaderFields(); + + Map headersFlat = new HashMap(); + + for (Map.Entry> entry : headers.entrySet()) { + String headerKey = entry.getKey(); + String valueKey = entry.getValue().get(0); + + if (headerKey != null && valueKey != null) { + headersFlat.put(headerKey, valueKey); + } + } + mParam.onDownloadBegin.onDownloadBegin(statusCode, lengthOfFile, headersFlat); + + input = new BufferedInputStream(connection.getInputStream(), 8 * 1024); + output = new FileOutputStream(param.dest); + byte data[] = new byte[8 * 1024]; + int total = 0; + int count; + + while ((count = input.read(data)) != -1) { + if (mAbort.get()) { + break; + } + + total += count; + publishProgress(new int[] { lengthOfFile, total }); + output.write(data, 0, count); + } + + output.flush(); + res.statusCode = statusCode; + res.bytesWritten = total; + } finally { + if (output != null) output.close(); + if (input != null) input.close(); + if (connection != null) connection.disconnect(); + } + } + protected void stop() { mAbort.set(true); } diff --git a/android/src/main/java/com/rnfs/RNFSManager.java b/android/src/main/java/com/rnfs/RNFSManager.java index aeca38e3..d64b4907 100644 --- a/android/src/main/java/com/rnfs/RNFSManager.java +++ b/android/src/main/java/com/rnfs/RNFSManager.java @@ -218,7 +218,7 @@ private void sendEvent(ReactContext reactContext, String eventName, @Nullable Wr } @ReactMethod - public void downloadFile(String urlStr, final String filepath, final int jobId, final Callback callback) { + public void downloadFile(String urlStr, final String filepath, String method, String postString, final int jobId, final Callback callback) { try { File file = new File(filepath); URL url = new URL(urlStr); @@ -227,6 +227,8 @@ public void downloadFile(String urlStr, final String filepath, final int jobId, params.src = url; params.dest = file; + params.method = method; + params.postString = postString; params.onTaskCompleted = new DownloadParams.OnTaskCompleted() { public void onTaskCompleted(DownloadResult res) { From 11abfa438f82a501469845b7e383d4547020b4d5 Mon Sep 17 00:00:00 2001 From: Samer Chahine Date: Sat, 8 Oct 2016 21:59:16 +0300 Subject: [PATCH 4/4] fixed typo and missing import --- android/src/main/java/com/rnfs/Downloader.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/android/src/main/java/com/rnfs/Downloader.java b/android/src/main/java/com/rnfs/Downloader.java index fb4e5497..47ce2dde 100644 --- a/android/src/main/java/com/rnfs/Downloader.java +++ b/android/src/main/java/com/rnfs/Downloader.java @@ -1,16 +1,15 @@ package com.rnfs; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileInputStream; import java.io.BufferedInputStream; +import java.io.DataOutputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; import java.net.HttpURLConnection; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import android.os.AsyncTask; @@ -111,7 +110,7 @@ private void downloadViaPost(DownloadParams param, DownloadResult res) throws IO connection.setRequestMethod("POST"); connection.setDoOutput(true); - DataOutputStream wr = new DataOutputStream(connectio.getOutputStream()); + DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); wr.writeBytes(param.postString); wr.flush(); wr.close();