author | spiralman <spiralman> | 2002-07-19 18:37:09 (UTC) |
---|---|---|
committer | spiralman <spiralman> | 2002-07-19 18:37:09 (UTC) |
commit | 3d98febb63ff5dcbd2a711b6f120aa5e00a0b337 (patch) (side-by-side diff) | |
tree | f4ca92851ae0f75a5d33c0badd7e81c9227b3571 /noncore/net/ubrowser/httpcomm.cpp | |
parent | e6b8378c45c717c11172b5af124aba6a0c6aecd3 (diff) | |
download | opie-3d98febb63ff5dcbd2a711b6f120aa5e00a0b337.zip opie-3d98febb63ff5dcbd2a711b6f120aa5e00a0b337.tar.gz opie-3d98febb63ff5dcbd2a711b6f120aa5e00a0b337.tar.bz2 |
initial add of ubrowser source
Diffstat (limited to 'noncore/net/ubrowser/httpcomm.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/ubrowser/httpcomm.cpp | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp new file mode 100644 index 0000000..51068db --- a/dev/null +++ b/noncore/net/ubrowser/httpcomm.cpp @@ -0,0 +1,256 @@ +/* +Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing +Copyright (C) 2002 Thomas Stephens + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free +Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "httpcomm.h" + +HttpComm::HttpComm(QSocket *newSocket, QTextBrowser *newBrowser):QObject() +{ + socket = newSocket; + + connect(socket, SIGNAL(hostFound()), this, SLOT(hostFound()) ); + connect(socket, SIGNAL(connected()), this, SLOT(connected()) ); + connect(socket, SIGNAL(readyRead()), this, SLOT(incoming()) ); + connect(socket, SIGNAL(connectionClosed()), this, SLOT(connectionClosed()) ); + + headerRead=false; + length = 0; + bRead = 0; + chunked=false; + lengthset=false; + + browser=newBrowser; +} + +void HttpComm::setUp(QString *newName) +{ + name = newName; +} + +void HttpComm::setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText) +{ + host = newHost; + portS = newPortS; + file = newFile; + text = newText; +} + +void HttpComm::hostFound() +{ + printf("HttpComm::hostFound: host found\n"); +} + +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); + } + 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); + if(clength==0) + { + processBody(); + done=true; + } + if(ba <= j) + { + status=1; + done=true; +// break; + } + else + { + done=false; + } + 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); + 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; + done=false; + break; + } + //the chunk extends beyond the current data; + else + { + body+=tempQString; + bRead+=ba; + printf("HttpComm::incoming: start new body piece 2: \n"); + printf("%s", tempQString.latin1() ); + printf("HttpComm::incoming: end new body piece 2.\n"); + done=true; + break; + } + break; + } + } + } + } + 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: 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); + + browser->setTextFormat(RichText); + browser->setText(body, context); + printf("%s\n", context.latin1() ); +} |