From 1e61fa0931f70326c0ff0cf8f34affd4f196f925 Mon Sep 17 00:00:00 2001 From: Christoph Nakazawa Date: Thu, 11 Jun 2020 07:21:00 -0700 Subject: [PATCH] Fix MultipartResponse to allow for binary data to be sent Summary: Changelog: [Internal] Reviewed By: motiz88 Differential Revision: D21995098 fbshipit-source-id: b387bd45b44fe93743d34d2a3435c165d15f054f --- .../RCTMultipartStreamReaderTests.m | 118 ++++++++++-------- 1 file changed, 68 insertions(+), 50 deletions(-) diff --git a/RNTester/RNTesterUnitTests/RCTMultipartStreamReaderTests.m b/RNTester/RNTesterUnitTests/RCTMultipartStreamReaderTests.m index 827f882077a..c24b461e762 100644 --- a/RNTester/RNTesterUnitTests/RCTMultipartStreamReaderTests.m +++ b/RNTester/RNTesterUnitTests/RCTMultipartStreamReaderTests.m @@ -15,84 +15,102 @@ @implementation RCTMultipartStreamReaderTests -- (void)testSimpleCase { +- (void)testSimpleCase +{ NSString *response = - @"preable, should be ignored\r\n" - @"--sample_boundary\r\n" - @"Content-Type: application/json; charset=utf-8\r\n" - @"Content-Length: 2\r\n\r\n" - @"{}\r\n" - @"--sample_boundary--\r\n" - @"epilogue, should be ignored"; + @"preamble, should be ignored\r\n" + @"--sample_boundary\r\n" + @"Content-Type: application/json; charset=utf-8\r\n" + @"Content-Length: 2\r\n\r\n" + @"{}\r\n" + @"--sample_boundary--\r\n" + @"epilogue, should be ignored"; NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; - RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"]; + RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream + boundary:@"sample_boundary"]; __block NSInteger count = 0; - BOOL success = [reader readAllPartsWithCompletionCallback:^(NSDictionary *headers, NSData *content, BOOL done) { - XCTAssertTrue(done); - XCTAssertEqualObjects(headers[@"Content-Type"], @"application/json; charset=utf-8"); - XCTAssertEqualObjects([[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding], @"{}"); - count++; - } progressCallback: nil]; + BOOL success = [reader + readAllPartsWithCompletionCallback:^(NSDictionary *headers, NSData *content, BOOL done) { + XCTAssertTrue(done); + XCTAssertEqualObjects(headers[@"Content-Type"], @"application/json; charset=utf-8"); + XCTAssertEqualObjects([[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding], @"{}"); + count++; + } + progressCallback:nil]; XCTAssertTrue(success); XCTAssertEqual(count, 1); } -- (void)testMultipleParts { +- (void)testMultipleParts +{ NSString *response = - @"preable, should be ignored\r\n" - @"--sample_boundary\r\n" - @"1\r\n" - @"--sample_boundary\r\n" - @"2\r\n" - @"--sample_boundary\r\n" - @"3\r\n" - @"--sample_boundary--\r\n" - @"epilogue, should be ignored"; + @"preamble, should be ignored\r\n" + @"--sample_boundary\r\n" + @"1\r\n" + @"--sample_boundary\r\n" + @"2\r\n" + @"--sample_boundary\r\n" + @"3\r\n" + @"--sample_boundary--\r\n" + @"epilogue, should be ignored"; NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; - RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"]; + RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream + boundary:@"sample_boundary"]; __block NSInteger count = 0; - BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, NSData *content, BOOL done) { - count++; - XCTAssertEqual(done, count == 3); - NSString *expectedBody = [NSString stringWithFormat:@"%ld", (long)count]; - NSString *actualBody = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding]; - XCTAssertEqualObjects(actualBody, expectedBody); - } progressCallback:nil]; + BOOL success = [reader + readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, NSData *content, BOOL done) { + count++; + XCTAssertEqual(done, count == 3); + NSString *expectedBody = [NSString stringWithFormat:@"%ld", (long)count]; + NSString *actualBody = [[NSString alloc] initWithData:content encoding:NSUTF8StringEncoding]; + XCTAssertEqualObjects(actualBody, expectedBody); + } + progressCallback:nil]; XCTAssertTrue(success); XCTAssertEqual(count, 3); } -- (void)testNoDelimiter { +- (void)testNoDelimiter +{ NSString *response = @"Yolo"; NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; - RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"]; + RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream + boundary:@"sample_boundary"]; __block NSInteger count = 0; - BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { - count++; - } progressCallback:nil]; + BOOL success = [reader + readAllPartsWithCompletionCallback:^( + __unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { + count++; + } + progressCallback:nil]; XCTAssertFalse(success); XCTAssertEqual(count, 0); } -- (void)testNoCloseDelimiter { +- (void)testNoCloseDelimiter +{ NSString *response = - @"preable, should be ignored\r\n" - @"--sample_boundary\r\n" - @"Content-Type: application/json; charset=utf-8\r\n" - @"Content-Length: 2\r\n\r\n" - @"{}\r\n" - @"--sample_boundary\r\n" - @"incomplete message..."; + @"preamble, should be ignored\r\n" + @"--sample_boundary\r\n" + @"Content-Type: application/json; charset=utf-8\r\n" + @"Content-Length: 2\r\n\r\n" + @"{}\r\n" + @"--sample_boundary\r\n" + @"incomplete message..."; NSInputStream *inputStream = [NSInputStream inputStreamWithData:[response dataUsingEncoding:NSUTF8StringEncoding]]; - RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream boundary:@"sample_boundary"]; + RCTMultipartStreamReader *reader = [[RCTMultipartStreamReader alloc] initWithInputStream:inputStream + boundary:@"sample_boundary"]; __block NSInteger count = 0; - BOOL success = [reader readAllPartsWithCompletionCallback:^(__unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { - count++; - } progressCallback:nil]; + BOOL success = [reader + readAllPartsWithCompletionCallback:^( + __unused NSDictionary *headers, __unused NSData *content, __unused BOOL done) { + count++; + } + progressCallback:nil]; XCTAssertFalse(success); XCTAssertEqual(count, 1); }