diff --git a/README.md b/README.md index 93ae63a..33c0a56 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,11 @@ Set a header for all future requests. Takes a header and a value. cordovaHTTP.setHeader("Header", "Value"); +### disableRedirect +If set to `true`, it won't follow redirects automatically. This is a global setting. + + cordovaHTTP.disableRedirect(true); + ### setDataSerializer Set the data serializer which will be used for all future POST and PUT requests. Takes a string representing the name of the serializer. diff --git a/src/android/com/synconset/cordovahttp/CordovaHttp.java b/src/android/com/synconset/cordovahttp/CordovaHttp.java index cce3aef..4efad65 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttp.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttp.java @@ -25,6 +25,7 @@ abstract class CordovaHttp { private static AtomicBoolean sslPinning = new AtomicBoolean(false); private static AtomicBoolean acceptAllCerts = new AtomicBoolean(false); private static AtomicBoolean validateDomainName = new AtomicBoolean(true); + private static AtomicBoolean disableRedirect = new AtomicBoolean(false); private String urlString; private JSONObject params; @@ -69,6 +70,10 @@ abstract class CordovaHttp { validateDomainName.set(accept); } + public static void disableRedirect(boolean disable) { + disableRedirect.set(disable); + } + protected String getUrlString() { return this.urlString; } @@ -114,6 +119,13 @@ abstract class CordovaHttp { return request; } + protected HttpRequest setupRedirect(HttpRequest request) { + if (disableRedirect.get()) { + request.followRedirects(false); + } + return request; + } + protected void respondWithError(int status, String msg) { try { JSONObject response = new JSONObject(); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpDelete.java b/src/android/com/synconset/cordovahttp/CordovaHttpDelete.java index c0a0c91..dbc8c96 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpDelete.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpDelete.java @@ -27,6 +27,7 @@ class CordovaHttpDelete extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.delete(this.getUrlString(), this.getParamsMap(), false); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java b/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java index 64542df..26268b1 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpDownload.java @@ -34,6 +34,7 @@ class CordovaHttpDownload extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParamsMap(), true); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpGet.java b/src/android/com/synconset/cordovahttp/CordovaHttpGet.java index 28d73e9..44360a9 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpGet.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpGet.java @@ -27,6 +27,7 @@ class CordovaHttpGet extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.get(this.getUrlString(), this.getParamsMap(), false); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpHead.java b/src/android/com/synconset/cordovahttp/CordovaHttpHead.java index 9938dd4..46f4c6f 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpHead.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpHead.java @@ -26,6 +26,7 @@ class CordovaHttpHead extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.head(this.getUrlString(), this.getParamsMap(), true); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java b/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java index e74908e..d7837b7 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpPlugin.java @@ -114,6 +114,10 @@ public class CordovaHttpPlugin extends CordovaPlugin { CordovaHttpDownload download = new CordovaHttpDownload(urlString, params, headers, callbackContext, filePath, timeoutInMilliseconds); cordova.getThreadPool().execute(download); + } else if (action.equals("disableRedirect")) { + boolean disable = args.getBoolean(0); + CordovaHttp.disableRedirect(disable); + callbackContext.success(); } else { return false; } diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpPost.java b/src/android/com/synconset/cordovahttp/CordovaHttpPost.java index e1970a1..b64c1a3 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpPost.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpPost.java @@ -26,6 +26,7 @@ class CordovaHttpPost extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.post(this.getUrlString()); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpPut.java b/src/android/com/synconset/cordovahttp/CordovaHttpPut.java index abf7983..1626e63 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpPut.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpPut.java @@ -26,6 +26,7 @@ class CordovaHttpPut extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.put(this.getUrlString()); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java b/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java index 5d06250..39bba4b 100644 --- a/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java +++ b/src/android/com/synconset/cordovahttp/CordovaHttpUpload.java @@ -42,6 +42,7 @@ class CordovaHttpUpload extends CordovaHttp implements Runnable { HttpRequest request = HttpRequest.post(this.getUrlString()); request.readTimeout(this.getRequestTimeout()); + this.setupRedirect(request); this.setupSecurity(request); request.acceptCharset(CHARSET); request.headers(this.getHeadersMap()); diff --git a/src/ios/CordovaHttpPlugin.h b/src/ios/CordovaHttpPlugin.h index 24cc395..c2fca3a 100644 --- a/src/ios/CordovaHttpPlugin.h +++ b/src/ios/CordovaHttpPlugin.h @@ -7,6 +7,7 @@ - (void)enableSSLPinning:(CDVInvokedUrlCommand*)command; - (void)acceptAllCerts:(CDVInvokedUrlCommand*)command; - (void)validateDomainName:(CDVInvokedUrlCommand*)command; +- (void)disableRedirect:(CDVInvokedUrlCommand*)command; - (void)post:(CDVInvokedUrlCommand*)command; - (void)get:(CDVInvokedUrlCommand*)command; - (void)put:(CDVInvokedUrlCommand*)command; diff --git a/src/ios/CordovaHttpPlugin.m b/src/ios/CordovaHttpPlugin.m index c24c229..8fe7c3a 100644 --- a/src/ios/CordovaHttpPlugin.m +++ b/src/ios/CordovaHttpPlugin.m @@ -11,15 +11,18 @@ - (NSNumber*)getStatusCode:(NSError*) error; - (NSMutableDictionary*)copyHeaderFields:(NSDictionary*)headerFields; - (void)setTimeout:(NSTimeInterval)timeout forManager:(AFHTTPSessionManager*)manager; +- (void)setRedirect:(AFHTTPSessionManager*)manager; @end @implementation CordovaHttpPlugin { AFSecurityPolicy *securityPolicy; + bool redirect; } - (void)pluginInitialize { securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; + redirect = true; } - (void)setRequestSerializer:(NSString*)serializerName forManager:(AFHTTPSessionManager*)manager { @@ -36,6 +39,16 @@ }]; } +- (void)setRedirect:(AFHTTPSessionManager*)manager { + [manager setTaskWillPerformHTTPRedirectionBlock:^NSURLRequest * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLResponse * _Nonnull response, NSURLRequest * _Nonnull request) { + if (redirect) { + return request; + } else { + return nil; + } + }]; +} + - (void)handleSuccess:(NSMutableDictionary*)dictionary withResponse:(NSHTTPURLResponse*)response andData:(id)data { if (response != nil) { [dictionary setObject:[NSNumber numberWithInt:response.statusCode] forKey:@"status"]; @@ -105,6 +118,16 @@ [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } +- (void)disableRedirect:(CDVInvokedUrlCommand*)command { + CDVPluginResult* pluginResult = nil; + bool disable = [[command.arguments objectAtIndex:0] boolValue]; + + redirect = !disable; + + pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; +} + - (void)acceptAllCerts:(CDVInvokedUrlCommand*)command { CDVPluginResult* pluginResult = nil; bool allow = [[command.arguments objectAtIndex:0] boolValue]; @@ -138,6 +161,7 @@ [self setRequestSerializer: serializerName forManager: manager]; [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; manager.responseSerializer = [TextResponseSerializer serializer]; @@ -169,6 +193,7 @@ [self setRequestSerializer: @"default" forManager: manager]; [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; @@ -201,6 +226,7 @@ [self setRequestSerializer: serializerName forManager: manager]; [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; manager.responseSerializer = [TextResponseSerializer serializer]; @@ -231,6 +257,7 @@ [self setRequestSerializer: @"default" forManager: manager]; [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; @@ -260,6 +287,7 @@ [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; @@ -295,6 +323,7 @@ [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; CordovaHttpPlugin* __weak weakSelf = self; manager.responseSerializer = [TextResponseSerializer serializer]; @@ -337,6 +366,7 @@ [self setRequestHeaders: headers forManager: manager]; [self setTimeout:timeoutInSeconds forManager:manager]; + [self setRedirect: manager]; if ([filePath hasPrefix:@"file://"]) { filePath = [filePath substringFromIndex:7]; diff --git a/www/advanced-http.js b/www/advanced-http.js index 36b62d3..14df36a 100644 --- a/www/advanced-http.js +++ b/www/advanced-http.js @@ -156,6 +156,9 @@ var http = { acceptAllCerts: function (allow, success, failure) { return exec(success, failure, 'CordovaHttpPlugin', 'acceptAllCerts', [allow]); }, + disableRedirect: function(disable, success, failure) { + return exec(success, failure, "CordovaHttpPlugin", "disableRedirect", [disable]); + }, validateDomainName: function (validate, success, failure) { return exec(success, failure, 'CordovaHttpPlugin', 'validateDomainName', [validate]); }, diff --git a/www/angular-integration.js b/www/angular-integration.js index 60c9f51..5199ee2 100644 --- a/www/angular-integration.js +++ b/www/angular-integration.js @@ -59,6 +59,9 @@ function registerService(http) { acceptAllCerts: function (allow) { return makePromise(http.acceptAllCerts, [allow]); }, + disableRedirect: function(disable) { + return makePromise(http.disableRedirect, [disable]); + }, validateDomainName: function (validate) { return makePromise(http.validateDomainName, [validate]); },