summaryrefslogtreecommitdiff
authorspiralman <spiralman>2002-08-02 21:09:06 (UTC)
committer spiralman <spiralman>2002-08-02 21:09:06 (UTC)
commitb228f8134306f469ec78ae8ab00ea5fdc0853538 (patch) (side-by-side diff)
treeefaedf7f15eb661665a71b678f6a07ce22a25c95
parentd3a54af5288cd30fc1a4f2dafc9f848b245046d6 (diff)
downloadopie-b228f8134306f469ec78ae8ab00ea5fdc0853538.zip
opie-b228f8134306f469ec78ae8ab00ea5fdc0853538.tar.gz
opie-b228f8134306f469ec78ae8ab00ea5fdc0853538.tar.bz2
fixed some bugs in chunked encoding stuff, but it still doesnt work. feels very close though...
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/ubrowser/httpcomm.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp
index b086b58..3c14053 100644
--- a/noncore/net/ubrowser/httpcomm.cpp
+++ b/noncore/net/ubrowser/httpcomm.cpp
@@ -105,172 +105,191 @@ void HttpComm::incoming()
printf("HttpComm::incoming: reading body\n");
printf("HttpComm::incoming: j is: %d\n", j);
if(!chunked)
{
//make sure we didnt just leave that break above...
if(j != 0)
{
for( ; j<ba ; j++)
{
body+=tempString[j];
bRead++;
// printf("bRead1: %d\n", bRead);
}
}
else
{
body += tempString;
bRead+=ba;
// printf("bRead2: %d\n", bRead);
}
if(bRead >= length)
{
printf("HttpComm::incoming: finished reading body\n");
processBody();
socket->close();
}
}
else
{
QString tempQString = tempString;
//remove the http header, if one exists
if(j != 0)
{
tempQString.remove(0, j+1);
printf("HttpComm::incoming: removing http header. Result: \n%s", tempQString.latin1());
}
while(!done)
{
switch(status)
{
//case 0=need to read chunk length
case 0:
j = tempQString.find('\n');
sclength = tempQString;
sclength.truncate(j);
clength = sclength.toUInt(0, 16);
printf("HttpComm::Incoming: chunk length: %d\n", clength);
+ printf("HttpComm::Incoming: chunk length string: %s\n", sclength.latin1());
//end of data
if(clength==0)
{
processBody();
done=true;
return;
}
//still more, but it hasnt been recieved yet
if(ba <= j)
{
- status=1;
+ status=2;
done=true;
break;
}
//still more data waiting
else
{
done=false;
//remove the chunk length header
tempQString.remove(0,j+1);
}
bRead=0;
// break;
//if there is more fall through to:
//chunk length just read, still more in tempQstring
case 1:
//the current data extends beyond the end of the chunk
if(bRead + tempQString.length() > clength)
{
QString newTQstring = tempQString;
newTQstring.truncate(clength-bRead);
bRead+=newTQstring.length();
body+=newTQstring;
printf("HttpComm::incoming: start new body piece 1: \n");
printf("%s", newTQstring.latin1() );
printf("HttpComm::incoming: end new body piece 1.\n");
status=0;
- j=clength-bRead;
+ tempQString = tempQString.remove(0, clength);
done=false;
// break;
}
//the chunk extends beyond the current data;
else
{
+ if(tempQString.length() <= ba)
+ {
+ body+=tempQString;
+ bRead+=tempQString.length();
+ }
+ else
+ {
+ tempQString.truncate(ba);
body+=tempQString;
bRead+=tempQString.length();
+ }
printf("HttpComm::incoming: start new body piece 2: \n");
printf("%s", tempQString.latin1() );
printf("HttpComm::incoming: end new body piece 2.\n");
done=true;
status=2;
// break;
}
break;
//just got data in, continue reading chunk
case 2:
//the current data extends beyond the end of the chunk
if(bRead + tempQString.length() > clength)
{
QString newTQstring = tempQString;
newTQstring.truncate(clength-bRead);
bRead+=newTQstring.length();
body+=newTQstring;
printf("HttpComm::incoming: start new body piece 3: \n");
printf("%s", newTQstring.latin1() );
printf("HttpComm::incoming: end new body piece 3.\n");
status=0;
- j=clength-bRead;
+ tempQString = tempQString.remove(0, clength);
done=false;
// break;
}
//the chunk extends beyond the current data;
else
{
+ if(tempQString.length() <= ba)
+ {
body+=tempQString;
bRead+=tempQString.length();
+ }
+ else
+ {
+ tempQString.truncate(ba);
+ body+=tempQString;
+ bRead+=tempQString.length();
+ }
printf("HttpComm::incoming: start new body piece 4: \n");
printf("%s", tempQString.latin1() );
printf("HttpComm::incoming: end new body piece 4.\n");
done=true;
status=2;
// break;
}
break;
}
printf("HttpComm::incoming: chunked encoding: bRead: %d\n", bRead);
}
}
}
delete tempString;
}
void HttpComm::connectionClosed()
{
printf("HttpComm::connectionClosed: connection closed\n");
processBody();
}
void HttpComm::parseHeader()
{
QStringList headerLines, tempList;
int i;
printf("HttpComm::parseHeader: start header\n\n");
printf("%s", header.latin1());
printf("HttpComm::parseHeader: end header\n");
headerLines = QStringList::split('\n', header);
for(i=0; i<headerLines.count(); i++)
{
if(headerLines[i].startsWith("Content-Length:") )
{
tempList = QStringList::split(':', headerLines[i]);
tempList[1].stripWhiteSpace();
length = tempList[1].toUInt();
}
else if(headerLines[i].startsWith("Transfer-Encoding: chunked") )
{
printf("HttpComm::parseHeader: using chunked encoding\n");
chunked = true;
status=0;
}
}