make file uploads work in firefox without proxy

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@25288 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Dave Wetzel 2007-06-22 23:48:25 +00:00
parent 1e6833238c
commit ce30e17469

View file

@ -180,6 +180,7 @@ static NSData* lineFeedData=nil;
request=[self createRequestFromRequestLine:requestLine request=[self createRequestFromRequestLine:requestLine
headers:headers headers:headers
data:data]; data:data];
//NSLog(@"%s %@",__PRETTY_FUNCTION__, request);
} }
NS_HANDLER NS_HANDLER
{ {
@ -368,31 +369,91 @@ NSMutableArray* unpackData(NSMutableData* data)
return headers; return headers;
} }
- (NSData*) _readPostData - (NSData*) _readPostDataMultipart:(BOOL) multip boundary:(NSString*) boundary
{ {
#define UPLOAD_LIMIT 1024*1024*10 // 10 MB #define UPLOAD_LIMIT 1024*1024*10 // 10 MB
#define TIME_LIMIT 30 // 30 seconds #define TIME_LIMIT 15 // seconds
time_t starttime, now; time_t starttime, now;
int totalLen = 0; BOOL crSeen = NO;
BOOL isElapsed = NO; BOOL nlSeen = NO;
NSMutableData* allMimeData = nil; BOOL crnlSeen = NO;
int crlfCount = 1;
int tmpPos = 0;
unsigned bytesSinceNewLine = 0;
BOOL isElapsed = NO;
NSMutableData* allMimeData = (NSMutableData*)[NSMutableData data];
NSData* boundaryData = nil;
unsigned boundaryLen = NSNotFound;
char buffer[5];
char buffer1[100];
if (multip) {
NSString * totalString = [[@"--" stringByAppendingString: boundary] stringByAppendingString:@"--"];
boundaryLen = [totalString length];
boundaryData = [totalString dataUsingEncoding: NSUTF8StringEncoding];
}
time(&starttime); time(&starttime);
while ((! isElapsed) && ([allMimeData length] <= UPLOAD_LIMIT)) { NS_DURING
NSData* dataBlock = [_stream readDataOfLengthNonBlocking:1024];
if (dataBlock) { while ((! isElapsed) && ([allMimeData length] <= UPLOAD_LIMIT) && (crlfCount > 0)) {
if (!allMimeData) { NSData* dataBlock = [_stream readDataOfLength:1];
allMimeData = (NSMutableData*)[NSMutableData data]; if ((dataBlock) && ([dataBlock length])) {
} [dataBlock getBytes:buffer];
[allMimeData appendData:dataBlock]; if (buffer[0] == 0xd) {
} else { crSeen = YES;
break;
}
time(&now); time(&now);
isElapsed = ((now - starttime) > TIME_LIMIT); isElapsed = ((now - starttime) > TIME_LIMIT);
} else {
if (buffer[0] == 0xa) {
nlSeen = YES;
} else {
crSeen = NO;
nlSeen = NO;
crnlSeen = NO;
bytesSinceNewLine++;
}
}
if (crlfCount > 0) {
[allMimeData appendData:dataBlock];
// printf("%c (%x)\n", buffer[0], buffer[0]); // cr (0d) + nl (0a)
}
if (crSeen && nlSeen) {
crnlSeen = YES;
crSeen = NO;
nlSeen = NO;
if (boundaryLen == bytesSinceNewLine) {
NSRange range = NSMakeRange([allMimeData length]-2-boundaryLen, boundaryLen);
NSData * tmpData = [allMimeData subdataWithRange: range];
if ([tmpData isEqual: boundaryData]) {
crlfCount = 0;
}
}
tmpPos = [allMimeData length];
if (multip == NO) {
crlfCount = 0;
}
bytesSinceNewLine = 0;
}
}
}
NS_HANDLER
NSLog(@"%@", [localException reason]);
NS_ENDHANDLER
if ([allMimeData length] == 0) {
return nil;
} }
return allMimeData; return allMimeData;
@ -485,7 +546,17 @@ NSMutableData* allMimeData = nil;
} }
// //
} else { // no content length info } else { // no content length info
allMimeData = [self _readPostData]; myArray = [headerDict objectForKey:@"content-type"];
if ((myArray) && ([myArray count])) {
NSString * multiStr = [myArray objectAtIndex:0];
BOOL multipart = ([multiStr hasPrefix:@"multipart/form-data;"]);
NSString * boundStr = nil;
if (multipart) {
boundStr = [multiStr substringFromIndex:30];
}
allMimeData = [self _readPostDataMultipart: multipart boundary: boundStr];
}
} }
allDataRead = YES; allDataRead = YES;
} else { } else {