Просмотр исходного кода

Support viewing AFNetworking request bodies

Ryan Olson лет назад: 10
Родитель
Сommit
85424fd15e

+ 3 - 0
Classes/Network/FLEXNetworkTransaction.h

@@ -36,6 +36,9 @@ typedef NS_ENUM(NSInteger, FLEXNetworkTransactionState) {
 /// Only applicable for image downloads. A small thumbnail to preview the full response.
 /// Only applicable for image downloads. A small thumbnail to preview the full response.
 @property (nonatomic, strong) UIImage *responseThumbnail;
 @property (nonatomic, strong) UIImage *responseThumbnail;
 
 
+/// Populated lazily. Handles both normal HTTPBody data and HTTPBodyStreams.
+@property (nonatomic, strong, readonly) NSData *cachedRequestBody;
+
 + (NSString *)readableStringFromTransactionState:(FLEXNetworkTransactionState)state;
 + (NSString *)readableStringFromTransactionState:(FLEXNetworkTransactionState)state;
 
 
 @end
 @end

+ 28 - 0
Classes/Network/FLEXNetworkTransaction.m

@@ -8,6 +8,12 @@
 
 
 #import "FLEXNetworkTransaction.h"
 #import "FLEXNetworkTransaction.h"
 
 
+@interface FLEXNetworkTransaction ()
+
+@property (nonatomic, strong, readwrite) NSData *cachedRequestBody;
+
+@end
+
 @implementation FLEXNetworkTransaction
 @implementation FLEXNetworkTransaction
 
 
 - (NSString *)description
 - (NSString *)description
@@ -22,6 +28,28 @@
     return description;
     return description;
 }
 }
 
 
+- (NSData *)cachedRequestBody {
+    if (!_cachedRequestBody) {
+        if (self.request.HTTPBody != nil) {
+            _cachedRequestBody = self.request.HTTPBody;
+        } else if ([self.request.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) {
+            NSInputStream *bodyStream = [self.request.HTTPBodyStream copy];
+            const NSUInteger bufferSize = 1024;
+            uint8_t buffer[bufferSize];
+            NSMutableData *data = [NSMutableData data];
+            [bodyStream open];
+            NSInteger readBytes = 0;
+            do {
+                readBytes = [bodyStream read:buffer maxLength:bufferSize];
+                [data appendBytes:buffer length:readBytes];
+            } while (readBytes > 0);
+            [bodyStream close];
+            _cachedRequestBody = data;
+        }
+    }
+    return _cachedRequestBody;
+}
+
 + (NSString *)readableStringFromTransactionState:(FLEXNetworkTransactionState)state
 + (NSString *)readableStringFromTransactionState:(FLEXNetworkTransactionState)state
 {
 {
     NSString *readableString = nil;
     NSString *readableString = nil;

+ 4 - 4
Classes/Network/FLEXNetworkTransactionDetailTableViewController.m

@@ -264,10 +264,10 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
     requestMethodRow.detailText = transaction.request.HTTPMethod;
     requestMethodRow.detailText = transaction.request.HTTPMethod;
     [rows addObject:requestMethodRow];
     [rows addObject:requestMethodRow];
 
 
-    if ([transaction.request.HTTPBody length] > 0) {
+    if ([transaction.cachedRequestBody length] > 0) {
         FLEXNetworkDetailRow *postBodySizeRow = [[FLEXNetworkDetailRow alloc] init];
         FLEXNetworkDetailRow *postBodySizeRow = [[FLEXNetworkDetailRow alloc] init];
         postBodySizeRow.title = @"Request Body Size";
         postBodySizeRow.title = @"Request Body Size";
-        postBodySizeRow.detailText = [NSByteCountFormatter stringFromByteCount:[transaction.request.HTTPBody length] countStyle:NSByteCountFormatterCountStyleBinary];
+        postBodySizeRow.detailText = [NSByteCountFormatter stringFromByteCount:[transaction.cachedRequestBody length] countStyle:NSByteCountFormatterCountStyleBinary];
         [rows addObject:postBodySizeRow];
         [rows addObject:postBodySizeRow];
 
 
         FLEXNetworkDetailRow *postBodyRow = [[FLEXNetworkDetailRow alloc] init];
         FLEXNetworkDetailRow *postBodyRow = [[FLEXNetworkDetailRow alloc] init];
@@ -396,7 +396,7 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
 {
 {
     FLEXNetworkDetailSection *postBodySection = [[FLEXNetworkDetailSection alloc] init];
     FLEXNetworkDetailSection *postBodySection = [[FLEXNetworkDetailSection alloc] init];
     postBodySection.title = @"Request Body Parameters";
     postBodySection.title = @"Request Body Parameters";
-    if ([transaction.request.HTTPBody length] > 0) {
+    if ([transaction.cachedRequestBody length] > 0) {
         NSString *contentType = [transaction.request valueForHTTPHeaderField:@"Content-Type"];
         NSString *contentType = [transaction.request valueForHTTPHeaderField:@"Content-Type"];
         if ([contentType hasPrefix:@"application/x-www-form-urlencoded"]) {
         if ([contentType hasPrefix:@"application/x-www-form-urlencoded"]) {
             NSString *bodyString = [[NSString alloc] initWithData:[self postBodyDataForTransaction:transaction] encoding:NSUTF8StringEncoding];
             NSString *bodyString = [[NSString alloc] initWithData:[self postBodyDataForTransaction:transaction] encoding:NSUTF8StringEncoding];
@@ -470,7 +470,7 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
 
 
 + (NSData *)postBodyDataForTransaction:(FLEXNetworkTransaction *)transaction
 + (NSData *)postBodyDataForTransaction:(FLEXNetworkTransaction *)transaction
 {
 {
-    NSData *bodyData = transaction.request.HTTPBody;
+    NSData *bodyData = transaction.cachedRequestBody;
     if ([bodyData length] > 0) {
     if ([bodyData length] > 0) {
         NSString *contentEncoding = [transaction.request valueForHTTPHeaderField:@"Content-Encoding"];
         NSString *contentEncoding = [transaction.request valueForHTTPHeaderField:@"Content-Encoding"];
         if ([contentEncoding rangeOfString:@"deflate" options:NSCaseInsensitiveSearch].length > 0 || [contentEncoding rangeOfString:@"gzip" options:NSCaseInsensitiveSearch].length > 0) {
         if ([contentEncoding rangeOfString:@"deflate" options:NSCaseInsensitiveSearch].length > 0 || [contentEncoding rangeOfString:@"gzip" options:NSCaseInsensitiveSearch].length > 0) {