author | spiralman <spiralman> | 2002-08-02 21:09:06 (UTC) |
---|---|---|
committer | spiralman <spiralman> | 2002-08-02 21:09:06 (UTC) |
commit | b228f8134306f469ec78ae8ab00ea5fdc0853538 (patch) (side-by-side diff) | |
tree | efaedf7f15eb661665a71b678f6a07ce22a25c95 | |
parent | d3a54af5288cd30fc1a4f2dafc9f848b245046d6 (diff) | |
download | opie-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...
-rw-r--r-- | noncore/net/ubrowser/httpcomm.cpp | 33 |
1 files changed, 26 insertions, 7 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 @@ -57,242 +57,261 @@ void HttpComm::connected() QString request("GET " + file + " HTTP/1.1\r\nHost: " + host + ':' + portS + "\r\nConnection: close\r\n\r\n"); // QString request("GET " + file + " HTTP/1.0\r\n\r\n"); printf("HttpComm::data: bytes written: %d\n", socket->writeBlock(request.latin1(), request.length()) ); printf("HttpComm::data: request sent:\n%s", request.latin1()); headerRead=false; bRead=0; length = 0; header=""; body=""; chunked=false; lengthset=false; } void HttpComm::incoming() { int ba=socket->bytesAvailable(), i=0, j=0, semi=0; char *tempString = new char [ba]; bool nextChunk=false; bool done=false; socket->readBlock(tempString, ba); printf("HttpComm::incoming: ba: %d\n", ba); QString sclength; if(headerRead == false) { for(i=0; i<ba; i++) { if(tempString[i] != '\r') { if(tempString[i] == '\n' && header[header.length()-1] == '\n') { j=i; headerRead = true; parseHeader(); goto body; } else { header+=tempString[i]; } } // printf("%d %d\n", ba, i); } } else { body: 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 { - body+=tempQString; - bRead+=tempQString.length(); + 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 { - body+=tempQString; - bRead+=tempQString.length(); + 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; } } printf("HttpConn::parseHeader: content-length: %d\n", length); } void HttpComm::processBody() { printf("HttpComm::processBody: processing body\n"); // printf("HttpComm::processBody: start body\n\n"); // printf("%s", body.latin1()); // printf("HttpComm::processBody: end body\n"); int lastSlash = file.findRev('/'); QString end = file; end.truncate(lastSlash+1); QString context("http://"+host+':'+portS+end); printf("HttpComm::processBody: context: %s\n", context.latin1() ); browser->setTextFormat(RichText); browser->mimeSourceFactory()->setFilePath(context); browser->setText(body, context); } |