1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- //
- // MultipartMessagePart.m
- // HttpServer
- //
- // Created by Валерий Гаврилов on 29.03.12.
- // Copyright (c) 2012 LLC "Online Publishing Partners" (onlinepp.ru). All rights reserved.
- #import "MultipartMessageHeader.h"
- #import "MultipartMessageHeaderField.h"
- #import "HTTPLogging.h"
- //-----------------------------------------------------------------
- #pragma mark log level
- #ifdef DEBUG
- static const int httpLogLevel = HTTP_LOG_LEVEL_WARN;
- #else
- static const int httpLogLevel = HTTP_LOG_LEVEL_WARN;
- #endif
- //-----------------------------------------------------------------
- // implementation MultipartMessageHeader
- //-----------------------------------------------------------------
- @implementation MultipartMessageHeader
- @synthesize fields,encoding;
- - (id) initWithData:(NSData *)data formEncoding:(NSStringEncoding) formEncoding {
- if( nil == (self = [super init]) ) {
- return self;
- }
-
- fields = [[NSMutableDictionary alloc] initWithCapacity:1];
- // In case encoding is not mentioned,
- encoding = contentTransferEncoding_unknown;
- char* bytes = (char*)data.bytes;
- NSUInteger length = data.length;
- int offset = 0;
- // split header into header fields, separated by \r\n
- uint16_t fields_separator = 0x0A0D; // \r\n
- while( offset < length - 2 ) {
- // the !isspace condition is to support header unfolding
- if( (*(uint16_t*) (bytes+offset) == fields_separator) && ((offset == length - 2) || !(isspace(bytes[offset+2])) )) {
- NSData* fieldData = [NSData dataWithBytesNoCopy:bytes length:offset freeWhenDone:NO];
- MultipartMessageHeaderField* field = [[MultipartMessageHeaderField alloc] initWithData: fieldData contentEncoding:formEncoding];
- if( field ) {
- [fields setObject:field forKey:field.name];
- HTTPLogVerbose(@"MultipartFormDataParser: Processed Header field '%@'",field.name);
- }
- else {
- NSString* fieldStr = [[NSString alloc] initWithData:fieldData encoding:NSASCIIStringEncoding];
- HTTPLogWarn(@"MultipartFormDataParser: Failed to parse MIME header field. Input ASCII string:%@",fieldStr);
- }
- // move to the next header field
- bytes += offset + 2;
- length -= offset + 2;
- offset = 0;
- continue;
- }
- ++ offset;
- }
-
- if( !fields.count ) {
- // it was an empty header.
- // we have to set default values.
- // default header.
- [fields setObject:@"text/plain" forKey:@"Content-Type"];
- }
- return self;
- }
- - (NSString *)description {
- return [NSString stringWithFormat:@"%@",fields];
- }
- @end
|