Permalink
Browse files

Fix blob response parsing for empty body on iOS

Summary:
We currently handle empty body poorly in the iOS blob implementation, this happens because of an early return that cause the blob response to not be processed by the blob module, resulting in an empty string as the body instead of a blob object. We also need to make sure to create an empty blob object when data is nil (empty body) as per the XMLHttpRequest spec. The Android implementation was already handling this properly.

Fixes #18223

Send a HEAD request

```js
fetch('https://apipre.monkimun.com/whoami', {
  body: null,
  method: 'HEAD',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
})
```

[IOS][BUGFIX][Blob] - Fix blob response parsing for empty body
Closes #18547

Differential Revision: D7415950

Pulled By: hramos

fbshipit-source-id: 56860532c6171255869f02a0960f55d155184a46
  • Loading branch information...
janicduplessis authored and grabbou committed Mar 27, 2018
1 parent 8a6ab14 commit 093a78d99d09b408a8261c29547c06d6796489fe
Showing with 7 additions and 4 deletions.
  1. +3 −0 Libraries/Blob/RCTBlobManager.mm
  2. +4 −4 Libraries/Network/RCTNetworking.mm
@@ -258,6 +258,9 @@ - (BOOL)canHandleNetworkingResponse:(NSString *)responseType
- (id)handleNetworkingResponse:(NSURLResponse *)response data:(NSData *)data
{
// An empty body will have nil for data, in this case we need to return
// an empty blob as per the XMLHttpRequest spec.
data = data ?: [NSData new];
return @{
@"blobId": [self store:data],
@"offset": @0,
@@ -439,10 +439,6 @@ - (void)sendData:(NSData *)data
{
RCTAssertThread(_methodQueue, @"sendData: must be called on method queue");
if (data.length == 0) {
return;
}
id responseData = nil;
for (id<RCTNetworkingResponseHandler> handler in _responseHandlers) {
if ([handler canHandleNetworkingResponse:responseType]) {
@@ -452,6 +448,10 @@ - (void)sendData:(NSData *)data
}
if (!responseData) {
if (data.length == 0) {
return;
}
if ([responseType isEqualToString:@"text"]) {
// No carry storage is required here because the entire data has been loaded.
responseData = [RCTNetworking decodeTextData:data fromResponse:task.response withCarryData:nil];

0 comments on commit 093a78d

Please sign in to comment.