diff --git a/CGDWebServer/GCDWebServer.m b/CGDWebServer/GCDWebServer.m index c5e5872..445ab78 100644 --- a/CGDWebServer/GCDWebServer.m +++ b/CGDWebServer/GCDWebServer.m @@ -151,6 +151,17 @@ NSDate* GCDWebServerParseHTTPDate(NSString* string) { return date; } +NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType) { + if ([contentType hasPrefix:@"text/"] || [contentType isEqualToString:@"application/json"] || [contentType isEqualToString:@"application/xml"]) { + NSString* charset = GCDWebServerExtractHeaderValueParameter(contentType, @"charset"); + NSString* string = [[NSString alloc] initWithData:data encoding:GCDWebServerStringEncodingFromCharset(charset)]; + if (string) { + return ARC_AUTORELEASE(string); + } + } + return [NSString stringWithFormat:@"<%lu bytes>", (unsigned long)data.length]; +} + NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension) { static NSDictionary* _overrides = nil; if (_overrides == nil) { diff --git a/CGDWebServer/GCDWebServerDataRequest.m b/CGDWebServer/GCDWebServerDataRequest.m index 0e9955b..c3836de 100644 --- a/CGDWebServer/GCDWebServerDataRequest.m +++ b/CGDWebServer/GCDWebServerDataRequest.m @@ -70,6 +70,15 @@ return YES; } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + if (_data) { + [description appendString:@"\n\n"]; + [description appendString:GCDWebServerDescribeData(_data, self.contentType)]; + } + return description; +} + @end @implementation GCDWebServerDataRequest (Extensions) diff --git a/CGDWebServer/GCDWebServerDataResponse.m b/CGDWebServer/GCDWebServerDataResponse.m index d7f292f..fb53106 100644 --- a/CGDWebServer/GCDWebServerDataResponse.m +++ b/CGDWebServer/GCDWebServerDataResponse.m @@ -73,6 +73,13 @@ return data; } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + [description appendString:@"\n\n"]; + [description appendString:GCDWebServerDescribeData(_data, self.contentType)]; + return description; +} + @end @implementation GCDWebServerDataResponse (Extensions) diff --git a/CGDWebServer/GCDWebServerFileResponse.m b/CGDWebServer/GCDWebServerFileResponse.m index b390b8e..314b587 100644 --- a/CGDWebServer/GCDWebServerFileResponse.m +++ b/CGDWebServer/GCDWebServerFileResponse.m @@ -170,4 +170,10 @@ static inline NSDate* _NSDateFromTimeSpec(const struct timespec* t) { close(_file); } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + [description appendFormat:@"\n\n{%@}", _path]; + return description; +} + @end diff --git a/CGDWebServer/GCDWebServerMultiPartFormRequest.m b/CGDWebServer/GCDWebServerMultiPartFormRequest.m index 39b365a..2cb4a6f 100644 --- a/CGDWebServer/GCDWebServerMultiPartFormRequest.m +++ b/CGDWebServer/GCDWebServerMultiPartFormRequest.m @@ -100,7 +100,7 @@ static NSData* _dashNewlineData = nil; } - (NSString*)description { - return [NSString stringWithFormat:@"<%@ | '%@' | %i bytes>", [self class], self.mimeType, (int)_data.length]; + return [NSString stringWithFormat:@"<%@ | '%@' | %lu bytes>", [self class], self.mimeType, (unsigned long)_data.length]; } @end @@ -198,6 +198,14 @@ static NSData* _dashNewlineData = nil; return self; } +- (void)dealloc { + ARC_RELEASE(_arguments); + ARC_RELEASE(_files); + ARC_RELEASE(_boundary); + + ARC_DEALLOC(super); +} + - (BOOL)open:(NSError**)error { _parserData = [[NSMutableData alloc] initWithCapacity:kMultiPartBufferSize]; _parserState = kParserState_Start; @@ -357,12 +365,24 @@ static NSData* _dashNewlineData = nil; return YES; } -- (void)dealloc { - ARC_RELEASE(_arguments); - ARC_RELEASE(_files); - ARC_RELEASE(_boundary); - - ARC_DEALLOC(super); +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + if (_arguments.count) { + [description appendString:@"\n"]; + for (NSString* key in [[_arguments allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + GCDWebServerMultiPartArgument* argument = [_arguments objectForKey:key]; + [description appendFormat:@"\n%@ (%@)\n", key, argument.contentType]; + [description appendString:GCDWebServerDescribeData(argument.data, argument.contentType)]; + } + } + if (_files.count) { + [description appendString:@"\n"]; + for (NSString* key in [[_files allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + GCDWebServerMultiPartFile* file = [_files objectForKey:key]; + [description appendFormat:@"\n%@ (%@): %@\n{%@}", key, file.contentType, file.fileName, file.temporaryPath]; + } + } + return description; } @end diff --git a/CGDWebServer/GCDWebServerPrivate.h b/CGDWebServer/GCDWebServerPrivate.h index d25c819..e9a0902 100644 --- a/CGDWebServer/GCDWebServerPrivate.h +++ b/CGDWebServer/GCDWebServerPrivate.h @@ -114,6 +114,7 @@ extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSStr extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset); extern NSString* GCDWebServerFormatHTTPDate(NSDate* date); extern NSDate* GCDWebServerParseHTTPDate(NSString* string); +extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType); @interface GCDWebServerConnection () - (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket; diff --git a/CGDWebServer/GCDWebServerRequest.m b/CGDWebServer/GCDWebServerRequest.m index 72bd41d..3df02f3 100644 --- a/CGDWebServer/GCDWebServerRequest.m +++ b/CGDWebServer/GCDWebServerRequest.m @@ -307,4 +307,16 @@ return [_writer close:error]; } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithFormat:@"%@ %@", _method, _path]; + for (NSString* argument in [[_query allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n %@ = %@", argument, [_query objectForKey:argument]]; + } + [description appendString:@"\n"]; + for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]]; + } + return description; +} + @end diff --git a/CGDWebServer/GCDWebServerResponse.m b/CGDWebServer/GCDWebServerResponse.m index 25714c6..ce68cc7 100644 --- a/CGDWebServer/GCDWebServerResponse.m +++ b/CGDWebServer/GCDWebServerResponse.m @@ -254,6 +254,30 @@ [_reader close]; } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithFormat:@"Status Code = %i", (int)_status]; + if (_type) { + [description appendFormat:@"\nContent Type = %@", _type]; + } + if (_length != NSNotFound) { + [description appendFormat:@"\nContent Length = %lu", (unsigned long)_length]; + } + [description appendFormat:@"\nCache Control Max Age = %lu", (unsigned long)_maxAge]; + if (_lastModified) { + [description appendFormat:@"\nLast Modified Date = %@", _lastModified]; + } + if (_eTag) { + [description appendFormat:@"\nETag = %@", _eTag]; + } + if (_headers.count) { + [description appendString:@"\n"]; + for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n%@: %@", header, [_headers objectForKey:header]]; + } + } + return description; +} + @end @implementation GCDWebServerResponse (Extensions) diff --git a/CGDWebServer/GCDWebServerStreamingResponse.m b/CGDWebServer/GCDWebServerStreamingResponse.m index fd79a8a..4ed68d4 100644 --- a/CGDWebServer/GCDWebServerStreamingResponse.m +++ b/CGDWebServer/GCDWebServerStreamingResponse.m @@ -58,4 +58,10 @@ return _block(error); } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + [description appendString:@"\n\n"]; + return description; +} + @end diff --git a/CGDWebServer/GCDWebServerURLEncodedFormRequest.m b/CGDWebServer/GCDWebServerURLEncodedFormRequest.m index 31207c4..c65747d 100644 --- a/CGDWebServer/GCDWebServerURLEncodedFormRequest.m +++ b/CGDWebServer/GCDWebServerURLEncodedFormRequest.m @@ -61,4 +61,13 @@ return YES; } +- (NSString*)description { + NSMutableString* description = [NSMutableString stringWithString:[super description]]; + [description appendString:@"\n"]; + for (NSString* argument in [[_arguments allKeys] sortedArrayUsingSelector:@selector(compare:)]) { + [description appendFormat:@"\n%@ = %@", argument, [_arguments objectForKey:argument]]; + } + return description; +} + @end