Skip to content

Commit b1850f8

Browse files
committed
Implemented response headers when using XMLHttpRequest
Summary: I think perhaps these were left out by mistake? Closes react#382 Github Author: Mike Driver <mikedriver@gmail.com> Test Plan: Imported from GitHub, without a `Test Plan:` line.
1 parent 7f9ee94 commit b1850f8

4 files changed

Lines changed: 33 additions & 24 deletions

File tree

Libraries/Network/RCTDataManager.m

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#import "RCTDataManager.h"
1111

1212
#import "RCTAssert.h"
13+
#import "RCTConvert.h"
1314
#import "RCTLog.h"
1415
#import "RCTUtils.h"
1516

@@ -22,46 +23,46 @@ @implementation RCTDataManager
2223
* The responseSender block won't be called on same thread as called.
2324
*/
2425
RCT_EXPORT_METHOD(queryData:(NSString *)queryType
25-
withQuery:(id)query
26+
withQuery:(NSDictionary *)query
2627
queryHash:(__unused NSString *)queryHash
2728
responseSender:(RCTResponseSenderBlock)responseSender)
2829
{
2930
if ([queryType isEqualToString:@"http"]) {
3031

31-
// Parse query
32-
NSDictionary *queryDict = query;
33-
if ([query isKindOfClass:[NSString class]]) {
34-
// TODO: it would be more efficient just to send a dictionary
35-
queryDict = RCTJSONParse(query, NULL);
36-
}
37-
3832
// Build request
39-
NSURL *url = [NSURL URLWithString:queryDict[@"url"]];
40-
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
41-
request.HTTPMethod = queryDict[@"method"] ?: @"GET";
42-
request.allHTTPHeaderFields = queryDict[@"headers"];
43-
if ([queryDict[@"data"] isKindOfClass:[NSString class]]) {
44-
request.HTTPBody = [queryDict[@"data"] dataUsingEncoding:NSUTF8StringEncoding];
45-
}
33+
NSURL *URL = [RCTConvert NSURL:query[@"url"]];
34+
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
35+
request.HTTPMethod = [RCTConvert NSString:query[@"method"]] ?: @"GET";
36+
request.allHTTPHeaderFields = [RCTConvert NSDictionary:query[@"headers"]];
37+
request.HTTPBody = [RCTConvert NSData:query[@"data"]];
4638

4739
// Build data task
4840
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *connectionError) {
4941

5042
// Build response
5143
NSDictionary *responseJSON;
5244
if (connectionError == nil) {
53-
NSStringEncoding encoding;
45+
NSStringEncoding encoding = NSUTF8StringEncoding;
5446
if (response.textEncodingName) {
5547
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName);
5648
encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
57-
} else {
58-
encoding = NSUTF8StringEncoding;
5949
}
60-
int responseCode = (int)[((NSHTTPURLResponse *)response) statusCode];
61-
NSString *returnData = [[NSString alloc] initWithData:data encoding:encoding];
62-
responseJSON = @{@"status": @(responseCode), @"responseText": returnData};
50+
NSHTTPURLResponse *httpResponse = nil;
51+
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
52+
// Might be a local file request
53+
httpResponse = (NSHTTPURLResponse *)response;
54+
}
55+
responseJSON = @{
56+
@"status": @([httpResponse statusCode] ?: 200),
57+
@"responseHeaders": [httpResponse allHeaderFields] ?: @{},
58+
@"responseText": [[NSString alloc] initWithData:data encoding:encoding] ?: @""
59+
};
6360
} else {
64-
responseJSON = @{@"status": @0, @"responseText": [connectionError localizedDescription]};
61+
responseJSON = @{
62+
@"status": @0,
63+
@"responseHeaders": @{},
64+
@"responseText": [connectionError localizedDescription]
65+
};
6566
}
6667

6768
// Send response (won't be sent on same thread as caller)

Libraries/Network/XMLHttpRequest.ios.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ class XMLHttpRequest extends XMLHttpRequestBase {
2222
sendImpl(method: ?string, url: ?string, headers: Object, data: any): void {
2323
RCTDataManager.queryData(
2424
'http',
25-
JSON.stringify({
25+
{
2626
method: method,
2727
url: url,
2828
data: data,
2929
headers: headers,
30-
}),
30+
},
31+
// TODO: Do we need this? is it used anywhere?
3132
'h' + crc32(method + '|' + url + '|' + data),
3233
(result) => {
3334
result = JSON.parse(result);

React/Base/RCTConvert.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
+ (NSDictionary *)NSDictionary:(id)json;
3939
+ (NSString *)NSString:(id)json;
4040
+ (NSNumber *)NSNumber:(id)json;
41+
+ (NSData *)NSData:(id)json;
4142

4243
+ (NSURL *)NSURL:(id)json;
4344
+ (NSURLRequest *)NSURLRequest:(id)json;

React/Base/RCTConvert.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ + (NSNumber *)NSNumber:(id)json
5050
return nil;
5151
}
5252

53+
+ (NSData *)NSData:(id)json
54+
{
55+
// TODO: should we automatically decode base64 data? Probably not...
56+
return [[self NSString:json] dataUsingEncoding:NSUTF8StringEncoding];
57+
}
58+
5359
+ (NSURL *)NSURL:(id)json
5460
{
5561
if (![json isKindOfClass:[NSString class]]) {

0 commit comments

Comments
 (0)