author | spiralman <spiralman> | 2002-07-22 22:37:22 (UTC) |
---|---|---|
committer | spiralman <spiralman> | 2002-07-22 22:37:22 (UTC) |
commit | c19b6cccd243107eb774c5e0bdb269265f3b5abe (patch) (side-by-side diff) | |
tree | 9c888fb5a6a09d102df3143b9458465c11e7380a | |
parent | 0433711d6f7190073c476a2f771dfce879ef87e5 (diff) | |
download | opie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.zip opie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.tar.gz opie-c19b6cccd243107eb774c5e0bdb269265f3b5abe.tar.bz2 |
fixed some bugs with chunked transfer encoding, still doesnt work though
-rw-r--r-- | noncore/net/ubrowser/Makefile | 20 | ||||
-rw-r--r-- | noncore/net/ubrowser/Makefile.in | 18 | ||||
-rw-r--r-- | noncore/net/ubrowser/httpcomm.cpp | 47 |
3 files changed, 62 insertions, 23 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; + 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() ); } |