summaryrefslogtreecommitdiff
authorspiralman <spiralman>2002-07-22 22:37:22 (UTC)
committer spiralman <spiralman>2002-07-22 22:37:22 (UTC)
commitc19b6cccd243107eb774c5e0bdb269265f3b5abe (patch) (side-by-side diff)
tree9c888fb5a6a09d102df3143b9458465c11e7380a
parent0433711d6f7190073c476a2f771dfce879ef87e5 (diff)
downloadopie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.zip
opie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.tar.gz
opie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.tar.bz2
fixed some bugs with chunked transfer encoding, still doesnt work though
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/ubrowser/Makefile20
-rw-r--r--noncore/net/ubrowser/Makefile.in18
-rw-r--r--noncore/net/ubrowser/httpcomm.cpp49
3 files changed, 63 insertions, 24 deletions
diff --git a/noncore/net/ubrowser/Makefile b/noncore/net/ubrowser/Makefile
index 4d92441..69aaf20 100644
--- a/noncore/net/ubrowser/Makefile
+++ b/noncore/net/ubrowser/Makefile
@@ -1,253 +1,253 @@
#############################################################################
-# Automatically generated from noncore/ubrowser/Makefile.in
+# Automatically generated from noncore/net/ubrowser/Makefile.in
# Build options from
#############################################################################
# Compiling
INTERFACE_DECL_PATH = .
SYSCONF_CXX = arm-linux-g++
SYSCONF_CC = arm-linux-gcc
DASHCROSS = -arm
# Compiling with support libraries
SYSCONF_CXXFLAGS_X11 =
SYSCONF_CXXFLAGS_QT = -I$(QTDIR)/include
SYSCONF_CXXFLAGS_OPENGL = -I/usr/X11R6/include
# Compiling YACC output
SYSCONF_CXXFLAGS_YACC = -Wno-unused -Wno-parentheses
# Linking with support libraries
SYSCONF_RPATH_X11 =
SYSCONF_RPATH_QT = -Wl,-rpath,$(QTDIR)/lib
SYSCONF_RPATH_OPENGL = -Wl,-rpath,/usr/X11R6/lib
# Linking with support libraries
# X11
SYSCONF_LFLAGS_X11 =
SYSCONF_LIBS_X11 =
# Qt, Qt+OpenGL
SYSCONF_LFLAGS_QT = -L$(QTDIR)/lib
SYSCONF_LIBS_QT = -lqte$(QT_THREAD_SUFFIX)
SYSCONF_LIBS_QT_OPENGL =
# OpenGL
SYSCONF_LFLAGS_OPENGL = -L/usr/X11R6/lib
SYSCONF_LIBS_OPENGL =
# Yacc
SYSCONF_LIBS_YACC =
# Linking applications
SYSCONF_LINK = arm-linux-gcc
SYSCONF_LFLAGS =
SYSCONF_LIBS =
# Link flags for shared objects
SYSCONF_LFLAGS_SHOBJ = -shared
# Flags for threading
SYSCONF_CFLAGS_THREAD = -D_REENTRANT
SYSCONF_CXXFLAGS_THREAD = -D_REENTRANT
SYSCONF_LFLAGS_THREAD =
SYSCONF_LIBS_THREAD = -lpthread
# Meta-object compiler
SYSCONF_MOC = $(QTDIR)/bin/moc
# UI compiler
SYSCONF_UIC = $(QTDIR)/bin/uic
# Linking shared libraries
# - Build the $(TARGET) library, eg. lib$(TARGET).so.2.2.2
# - Place target in $(DESTDIR) - which has a trailing /
# - Usually needs to incorporate $(VER_MAJ), $(VER_MIN) and $(VER_PATCH)
#
SYSCONF_LINK_SHLIB = arm-linux-gcc
SYSCONF_LINK_TARGET_SHARED = lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH)
SYSCONF_LINK_LIB_SHARED = $(SYSCONF_LINK_SHLIB) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
$(LFLAGS) -o $(SYSCONF_LINK_TARGET_SHARED) \
$(OBJECTS) $(OBJMOC) $(LIBS) && \
mv $(SYSCONF_LINK_TARGET_SHARED) $(DESTDIR); \
cd $(DESTDIR) && \
rm -f lib$(TARGET).so lib$(TARGET).so.$(VER_MAJ) lib$(TARGET).so.$(VER_MAJ).$(VER_MIN); \
ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so; \
ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so.$(VER_MAJ); \
ln -s $(SYSCONF_LINK_TARGET_SHARED) lib$(TARGET).so.$(VER_MAJ).$(VER_MIN)
# Linking static libraries
# - Build the $(TARGET) library, eg. lib$(TARGET).a
# - Place target in $(DESTDIR) - which has a trailing /
#
SYSCONF_AR = arm-linux-ar cqs
SYSCONF_LINK_TARGET_STATIC = lib$(TARGET).a
SYSCONF_LINK_LIB_STATIC = rm -f $(DESTDIR)$(SYSCONF_LINK_TARGET_STATIC) ; \
$(SYSCONF_AR) $(DESTDIR)$(SYSCONF_LINK_TARGET_STATIC) $(OBJECTS) $(OBJMOC)
# Compiling application source
SYSCONF_CXXFLAGS = -pipe -DQT_QWS_IPAQ -DQWS -fno-exceptions -fno-rtti -O2 -Wall -W
SYSCONF_CFLAGS = -pipe -O2 -Wall -W
# Default link type (static linking is still be used where required)
SYSCONF_LINK_LIB = $(SYSCONF_LINK_LIB_SHARED)
SYSCONF_LINK_TARGET = $(SYSCONF_LINK_TARGET_SHARED)
# Compiling library source
SYSCONF_CXXFLAGS_LIB = -fPIC
SYSCONF_CFLAGS_LIB = -fPIC
# Compiling shared-object source
SYSCONF_CXXFLAGS_SHOBJ = -fPIC
SYSCONF_CFLAGS_SHOBJ = -fPIC
# Linking Qt
SYSCONF_LIBS_QTLIB = $(SYSCONF_LFLAGS_X11) $(QT_LIBS_MT) $(QT_LIBS_OPT)
# Linking Qt applications
SYSCONF_LIBS_QTAPP =
#############################################################################
####### Compiler, tools and options
CXX = $(SYSCONF_CXX) $(QT_CXX_MT)
CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS)
CC = $(SYSCONF_CC) $(QT_C_MT)
CFLAGS = $(SYSCONF_CFLAGS)
-INCPATH = -I$(OPIEDIR)/include
+INCPATH = -I../../../include
LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP)
MOC = $(SYSCONF_MOC)
UIC = $(SYSCONF_UIC)
####### Target
-DESTDIR = $(OPIEDIR)/bin/
+DESTDIR = ../../../bin/
VER_MAJ = 1
VER_MIN = 0
VER_PATCH = 0
TARGET = ubrowser
TARGET1 = lib$(TARGET).so.$(VER_MAJ)
####### Files
HEADERS = mainview.h \
httpfactory.h \
httpcomm.h
SOURCES = main.cpp \
mainview.cpp \
httpfactory.cpp \
httpcomm.cpp
OBJECTS = main.o \
mainview.o \
httpfactory.o \
httpcomm.o
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC = moc_mainview.cpp \
moc_httpcomm.cpp
OBJMOC = moc_mainview.o \
moc_httpcomm.o
####### Implicit rules
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
####### Build rules
all: $(DESTDIR)$(TARGET)
$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
$(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
moc: $(SRCMOC)
tmake:
tmake ubrowser.pro
clean:
-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
-rm -f *~ core
-rm -f allmoc.cpp
####### Extension Modules
listpromodules:
@echo
listallmodules:
@echo
listaddonpromodules:
@echo
listaddonentmodules:
@echo
REQUIRES=
####### Sub-libraries
###### Combined headers
####### Compile
main.o: main.cpp \
- $(OPIEDIR)/include/qpe/qpeapplication.h \
+ ../../../include/qpe/qpeapplication.h \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
mainview.o: mainview.cpp \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
httpfactory.o: httpfactory.cpp \
httpfactory.h \
httpcomm.h
httpcomm.o: httpcomm.cpp \
httpcomm.h
moc_mainview.o: moc_mainview.cpp \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
moc_httpcomm.o: moc_httpcomm.cpp \
httpcomm.h
moc_mainview.cpp: mainview.h
$(MOC) mainview.h -o moc_mainview.cpp
moc_httpcomm.cpp: httpcomm.h
$(MOC) httpcomm.h -o moc_httpcomm.cpp
lupdate:
lupdate ubrowser.pro
lrelease:
lrelease ubrowser.pro
diff --git a/noncore/net/ubrowser/Makefile.in b/noncore/net/ubrowser/Makefile.in
index 010f16f..43b5111 100644
--- a/noncore/net/ubrowser/Makefile.in
+++ b/noncore/net/ubrowser/Makefile.in
@@ -1,147 +1,147 @@
#############################################################################
####### Compiler, tools and options
CXX = $(SYSCONF_CXX) $(QT_CXX_MT)
CXXFLAGS= $(SYSCONF_CXXFLAGS_QT) $(SYSCONF_CXXFLAGS)
CC = $(SYSCONF_CC) $(QT_C_MT)
CFLAGS = $(SYSCONF_CFLAGS)
-INCPATH = -I$(OPIEDIR)/include
+INCPATH = -I../../../include
LFLAGS = $(SYSCONF_LFLAGS_QT) $(SYSCONF_RPATH_QT) $(SYSCONF_LFLAGS) $(QT_LFLAGS_MT)
LIBS = $(SUBLIBS) -lqpe $(SYSCONF_LIBS_QT) $(SYSCONF_LIBS) $(SYSCONF_LIBS_QTAPP)
MOC = $(SYSCONF_MOC)
UIC = $(SYSCONF_UIC)
####### Target
-DESTDIR = $(OPIEDIR)/bin/
+DESTDIR = ../../../bin/
VER_MAJ = 1
VER_MIN = 0
VER_PATCH = 0
TARGET = ubrowser
TARGET1 = lib$(TARGET).so.$(VER_MAJ)
####### Files
HEADERS = mainview.h \
httpfactory.h \
httpcomm.h
SOURCES = main.cpp \
mainview.cpp \
httpfactory.cpp \
httpcomm.cpp
OBJECTS = main.o \
mainview.o \
httpfactory.o \
httpcomm.o
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC = moc_mainview.cpp \
moc_httpcomm.cpp
OBJMOC = moc_mainview.o \
moc_httpcomm.o
####### Implicit rules
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cxx.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.cc.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
####### Build rules
all: $(DESTDIR)$(TARGET)
$(DESTDIR)$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS)
$(SYSCONF_LINK) $(LFLAGS) -o $(DESTDIR)$(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
moc: $(SRCMOC)
tmake:
tmake ubrowser.pro
clean:
-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS)
-rm -f *~ core
-rm -f allmoc.cpp
####### Extension Modules
listpromodules:
@echo
listallmodules:
@echo
listaddonpromodules:
@echo
listaddonentmodules:
@echo
REQUIRES=
####### Sub-libraries
###### Combined headers
####### Compile
main.o: main.cpp \
- $(OPIEDIR)/include/qpe/qpeapplication.h \
+ ../../../include/qpe/qpeapplication.h \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
mainview.o: mainview.cpp \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
httpfactory.o: httpfactory.cpp \
httpfactory.h \
httpcomm.h
httpcomm.o: httpcomm.cpp \
httpcomm.h
moc_mainview.o: moc_mainview.cpp \
mainview.h \
- $(OPIEDIR)/include/qpe/resource.h \
- $(OPIEDIR)/include/qpe/qpetoolbar.h \
+ ../../../include/qpe/resource.h \
+ ../../../include/qpe/qpetoolbar.h \
httpfactory.h \
httpcomm.h
moc_httpcomm.o: moc_httpcomm.cpp \
httpcomm.h
moc_mainview.cpp: mainview.h
$(MOC) mainview.h -o moc_mainview.cpp
moc_httpcomm.cpp: httpcomm.h
$(MOC) httpcomm.h -o moc_httpcomm.cpp
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp
index 51068db..54f7acf 100644
--- a/noncore/net/ubrowser/httpcomm.cpp
+++ b/noncore/net/ubrowser/httpcomm.cpp
@@ -1,256 +1,295 @@
/*
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);
+ 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;
}
+ //still more, but it hasnt been recieved yet
if(ba <= j)
{
status=1;
done=true;
-// break;
+ break;
}
+ //still more data waiting
else
{
done=false;
+ //remove the chunk length header
+ tempQString.remove(0,j+1);
}
bRead=0;
- break;
+// 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;
+// 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;
+ 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;
+ 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: 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() );
}