mirror of
https://github.com/gnustep/libs-gsweb.git
synced 2025-04-25 00:11:46 +00:00
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:
parent
1e6833238c
commit
ce30e17469
1 changed files with 91 additions and 20 deletions
|
@ -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];
|
||||||
|
if (buffer[0] == 0xd) {
|
||||||
|
crSeen = YES;
|
||||||
|
time(&now);
|
||||||
|
isElapsed = ((now - starttime) > TIME_LIMIT);
|
||||||
|
} else {
|
||||||
|
if (buffer[0] == 0xa) {
|
||||||
|
nlSeen = YES;
|
||||||
|
} else {
|
||||||
|
crSeen = NO;
|
||||||
|
nlSeen = NO;
|
||||||
|
crnlSeen = NO;
|
||||||
|
bytesSinceNewLine++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
[allMimeData appendData:dataBlock];
|
|
||||||
} else {
|
if (crlfCount > 0) {
|
||||||
break;
|
[allMimeData appendData:dataBlock];
|
||||||
}
|
// printf("%c (%x)\n", buffer[0], buffer[0]); // cr (0d) + nl (0a)
|
||||||
time(&now);
|
}
|
||||||
isElapsed = ((now - starttime) > TIME_LIMIT);
|
|
||||||
|
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 {
|
||||||
|
|
Loading…
Reference in a new issue