HTTPSource header search fix for boundary conditions.
parent
ea4eb96c2a
commit
6f8d1b8e99
|
@ -56,49 +56,52 @@
|
||||||
|
|
||||||
- (int)read:(void *)buffer amount:(int)amount
|
- (int)read:(void *)buffer amount:(int)amount
|
||||||
{
|
{
|
||||||
int l = [_socket receive:buffer amount:amount];
|
|
||||||
|
|
||||||
if (!pastHeader) {
|
if (!pastHeader) {
|
||||||
uint8_t *f = (uint8_t *)strnstr((const char *)buffer, "\r\n\r\n", l);
|
const int delimeter_size = 4; //\r\n\r\n
|
||||||
if (f)
|
|
||||||
{
|
int l = [_socket receive:buffer amount:amount];
|
||||||
pastHeader = YES;
|
uint8_t *f;
|
||||||
|
while(NULL == (f = (uint8_t *)strnstr((const char *)buffer, "\r\n\r\n", l))) {
|
||||||
|
//Need to check for boundary conditions
|
||||||
|
memmove(buffer, (uint8_t *)buffer + (l - delimeter_size), delimeter_size);
|
||||||
|
l = [_socket receive:((uint8_t *)buffer + delimeter_size) amount:(amount - delimeter_size)];
|
||||||
|
}
|
||||||
|
|
||||||
|
pastHeader = YES;
|
||||||
|
|
||||||
uint8_t *bufferOffset = f + 4; //\r\n\r\n
|
uint8_t *bufferOffset = f + delimeter_size;
|
||||||
uint8_t *bufferEnd = (uint8_t *)buffer + l;
|
uint8_t *bufferEnd = (uint8_t *)buffer + l;
|
||||||
int amountRemaining = bufferEnd - bufferOffset;
|
int amountRemaining = bufferEnd - bufferOffset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//For testing only
|
//For testing only
|
||||||
FILE *testFout = fopen("header.raw", "w");
|
FILE *testFout = fopen("header.raw", "w");
|
||||||
fwrite(buffer, 1, bufferOffset - (uint8_t *)buffer, testFout);
|
fwrite(buffer, 1, bufferOffset - (uint8_t *)buffer, testFout);
|
||||||
fclose(testFout);
|
fclose(testFout);
|
||||||
|
|
||||||
testFout = fopen("test.raw", "w");
|
testFout = fopen("test.raw", "w");
|
||||||
fwrite(bufferOffset, 1, amountRemaining, testFout);
|
fwrite(bufferOffset, 1, amountRemaining, testFout);
|
||||||
fclose(testFout);
|
fclose(testFout);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memmove(buffer,bufferOffset, amountRemaining);
|
memmove(buffer,bufferOffset, amountRemaining);
|
||||||
|
|
||||||
return amountRemaining + [self read:((uint8_t *)buffer + amountRemaining) amount:(amount - amountRemaining)];
|
return amountRemaining + [self read:((uint8_t *)buffer + amountRemaining) amount:(amount - amountRemaining)];
|
||||||
}
|
|
||||||
else {
|
|
||||||
//Keep searching for header. Note: NEED TO WATCH BOUNDARY CASES
|
|
||||||
return [self read:buffer amount:amount];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
int l = [_socket receive:buffer amount:amount];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//FOR TESTING ONLY
|
//FOR TESTING ONLY
|
||||||
FILE *testFout = fopen("test.raw", "a");
|
FILE *testFout = fopen("test.raw", "a");
|
||||||
fwrite(buffer, 1, l, testFout);
|
fwrite(buffer, 1, l, testFout);
|
||||||
fclose(testFout);
|
fclose(testFout);
|
||||||
*/
|
*/
|
||||||
if (l > 0)
|
if (l > 0)
|
||||||
byteCount += l;
|
byteCount += l;
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)close
|
- (void)close
|
||||||
|
|
Loading…
Reference in New Issue