author | spiralman <spiralman> | 2002-07-25 16:38:22 (UTC) |
---|---|---|
committer | spiralman <spiralman> | 2002-07-25 16:38:22 (UTC) |
commit | 11170a8b8c1a2755cb7d9416ea99fc5067d0c53d (patch) (side-by-side diff) | |
tree | 0e2ea513139dfd146e8fe8f96f8fb791d2382e17 | |
parent | 8895e9bd55244f32f12ff619e020a23afac44808 (diff) | |
download | opie-11170a8b8c1a2755cb7d9416ea99fc5067d0c53d.zip opie-11170a8b8c1a2755cb7d9416ea99fc5067d0c53d.tar.gz opie-11170a8b8c1a2755cb7d9416ea99fc5067d0c53d.tar.bz2 |
removed infinite loop with chunked encoding
fixed generation of context for http requests (QTextBrowser still ignores them)
chunked encoding still misses large portions of data...
-rw-r--r-- | noncore/net/ubrowser/httpcomm.cpp | 11 | ||||
-rw-r--r-- | noncore/net/ubrowser/moc_httpcomm.cpp | 2 | ||||
-rw-r--r-- | noncore/net/ubrowser/moc_mainview.cpp | 2 |
3 files changed, 9 insertions, 6 deletions
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp index 54f7acf..b086b58 100644 --- a/noncore/net/ubrowser/httpcomm.cpp +++ b/noncore/net/ubrowser/httpcomm.cpp @@ -1,295 +1,298 @@ /* 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+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); //end of data if(clength==0) { processBody(); done=true; + return; } //still more, but it hasnt been recieved yet if(ba <= j) { status=1; 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; done=false; // break; } //the chunk extends beyond the current data; else { body+=tempQString; - bRead+=ba; + 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; done=false; // break; } //the chunk extends beyond the current data; else { body+=tempQString; - bRead+=ba; + 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); + 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); - printf("%s\n", context.latin1() ); } diff --git a/noncore/net/ubrowser/moc_httpcomm.cpp b/noncore/net/ubrowser/moc_httpcomm.cpp index ba2b939..5622531 100644 --- a/noncore/net/ubrowser/moc_httpcomm.cpp +++ b/noncore/net/ubrowser/moc_httpcomm.cpp @@ -1,102 +1,102 @@ /**************************************************************************** ** HttpComm meta object code from reading C++ file 'httpcomm.h' ** -** Created: Fri Jul 19 21:08:51 2002 +** Created: Thu Jul 25 10:24:04 2002 ** by: The Qt MOC ($Id$) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #if !defined(Q_MOC_OUTPUT_REVISION) #define Q_MOC_OUTPUT_REVISION 9 #elif Q_MOC_OUTPUT_REVISION != 9 #error "Moc format conflict - please regenerate all moc files" #endif #include "httpcomm.h" #include <qmetaobject.h> #include <qapplication.h> const char *HttpComm::className() const { return "HttpComm"; } QMetaObject *HttpComm::metaObj = 0; void HttpComm::initMetaObject() { if ( metaObj ) return; if ( qstrcmp(QObject::className(), "QObject") != 0 ) badSuperclassWarning("HttpComm","QObject"); (void) staticMetaObject(); } #ifndef QT_NO_TRANSLATION QString HttpComm::tr(const char* s) { return qApp->translate( "HttpComm", s, 0 ); } QString HttpComm::tr(const char* s, const char * c) { return qApp->translate( "HttpComm", s, c ); } #endif // QT_NO_TRANSLATION QMetaObject* HttpComm::staticMetaObject() { if ( metaObj ) return metaObj; (void) QObject::staticMetaObject(); #ifndef QT_NO_PROPERTIES #endif // QT_NO_PROPERTIES typedef void (HttpComm::*m1_t0)(); typedef void (QObject::*om1_t0)(); typedef void (HttpComm::*m1_t1)(); typedef void (QObject::*om1_t1)(); typedef void (HttpComm::*m1_t2)(); typedef void (QObject::*om1_t2)(); typedef void (HttpComm::*m1_t3)(); typedef void (QObject::*om1_t3)(); m1_t0 v1_0 = &HttpComm::hostFound; om1_t0 ov1_0 = (om1_t0)v1_0; m1_t1 v1_1 = &HttpComm::connected; om1_t1 ov1_1 = (om1_t1)v1_1; m1_t2 v1_2 = &HttpComm::connectionClosed; om1_t2 ov1_2 = (om1_t2)v1_2; m1_t3 v1_3 = &HttpComm::incoming; om1_t3 ov1_3 = (om1_t3)v1_3; QMetaData *slot_tbl = QMetaObject::new_metadata(4); QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(4); slot_tbl[0].name = "hostFound()"; slot_tbl[0].ptr = (QMember)ov1_0; slot_tbl_access[0] = QMetaData::Public; slot_tbl[1].name = "connected()"; slot_tbl[1].ptr = (QMember)ov1_1; slot_tbl_access[1] = QMetaData::Public; slot_tbl[2].name = "connectionClosed()"; slot_tbl[2].ptr = (QMember)ov1_2; slot_tbl_access[2] = QMetaData::Public; slot_tbl[3].name = "incoming()"; slot_tbl[3].ptr = (QMember)ov1_3; slot_tbl_access[3] = QMetaData::Public; metaObj = QMetaObject::new_metaobject( "HttpComm", "QObject", slot_tbl, 4, 0, 0, #ifndef QT_NO_PROPERTIES 0, 0, 0, 0, #endif // QT_NO_PROPERTIES 0, 0 ); metaObj->set_slot_access( slot_tbl_access ); #ifndef QT_NO_PROPERTIES #endif // QT_NO_PROPERTIES return metaObj; } diff --git a/noncore/net/ubrowser/moc_mainview.cpp b/noncore/net/ubrowser/moc_mainview.cpp index 9af282b..a188e12 100644 --- a/noncore/net/ubrowser/moc_mainview.cpp +++ b/noncore/net/ubrowser/moc_mainview.cpp @@ -1,88 +1,88 @@ /**************************************************************************** ** MainView meta object code from reading C++ file 'mainview.h' ** -** Created: Fri Jul 19 21:08:51 2002 +** Created: Thu Jul 25 10:24:03 2002 ** by: The Qt MOC ($Id$) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #if !defined(Q_MOC_OUTPUT_REVISION) #define Q_MOC_OUTPUT_REVISION 9 #elif Q_MOC_OUTPUT_REVISION != 9 #error "Moc format conflict - please regenerate all moc files" #endif #include "mainview.h" #include <qmetaobject.h> #include <qapplication.h> const char *MainView::className() const { return "MainView"; } QMetaObject *MainView::metaObj = 0; void MainView::initMetaObject() { if ( metaObj ) return; if ( qstrcmp(QMainWindow::className(), "QMainWindow") != 0 ) badSuperclassWarning("MainView","QMainWindow"); (void) staticMetaObject(); } #ifndef QT_NO_TRANSLATION QString MainView::tr(const char* s) { return qApp->translate( "MainView", s, 0 ); } QString MainView::tr(const char* s, const char * c) { return qApp->translate( "MainView", s, c ); } #endif // QT_NO_TRANSLATION QMetaObject* MainView::staticMetaObject() { if ( metaObj ) return metaObj; (void) QMainWindow::staticMetaObject(); #ifndef QT_NO_PROPERTIES #endif // QT_NO_PROPERTIES typedef void (MainView::*m1_t0)(); typedef void (QObject::*om1_t0)(); typedef void (MainView::*m1_t1)(); typedef void (QObject::*om1_t1)(); m1_t0 v1_0 = &MainView::goClicked; om1_t0 ov1_0 = (om1_t0)v1_0; m1_t1 v1_1 = &MainView::textChanged; om1_t1 ov1_1 = (om1_t1)v1_1; QMetaData *slot_tbl = QMetaObject::new_metadata(2); QMetaData::Access *slot_tbl_access = QMetaObject::new_metaaccess(2); slot_tbl[0].name = "goClicked()"; slot_tbl[0].ptr = (QMember)ov1_0; slot_tbl_access[0] = QMetaData::Public; slot_tbl[1].name = "textChanged()"; slot_tbl[1].ptr = (QMember)ov1_1; slot_tbl_access[1] = QMetaData::Public; metaObj = QMetaObject::new_metaobject( "MainView", "QMainWindow", slot_tbl, 2, 0, 0, #ifndef QT_NO_PROPERTIES 0, 0, 0, 0, #endif // QT_NO_PROPERTIES 0, 0 ); metaObj->set_slot_access( slot_tbl_access ); #ifndef QT_NO_PROPERTIES #endif // QT_NO_PROPERTIES return metaObj; } |