summaryrefslogtreecommitdiff
authorspiralman <spiralman>2002-07-25 16:38:22 (UTC)
committer spiralman <spiralman>2002-07-25 16:38:22 (UTC)
commit11170a8b8c1a2755cb7d9416ea99fc5067d0c53d (patch) (side-by-side diff)
tree0e2ea513139dfd146e8fe8f96f8fb791d2382e17
parent8895e9bd55244f32f12ff619e020a23afac44808 (diff)
downloadopie-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...
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/ubrowser/httpcomm.cpp11
-rw-r--r--noncore/net/ubrowser/moc_httpcomm.cpp2
-rw-r--r--noncore/net/ubrowser/moc_mainview.cpp2
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;
}