summaryrefslogtreecommitdiff
authorspiralman <spiralman>2003-03-15 15:27:49 (UTC)
committer spiralman <spiralman>2003-03-15 15:27:49 (UTC)
commit90c05874265e7047c0ca933a43c433eb0d7f04e4 (patch) (unidiff)
treed86c5d52c226f2a873b3c5745716dcd5ee38de3d
parent2c53d85583ebece42b3b4c155540cd6a01542731 (diff)
downloadopie-90c05874265e7047c0ca933a43c433eb0d7f04e4.zip
opie-90c05874265e7047c0ca933a43c433eb0d7f04e4.tar.gz
opie-90c05874265e7047c0ca933a43c433eb0d7f04e4.tar.bz2
moved from using QSockets to normal unix sockets, images and chunked encoding **should** work <crosses fingers>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/ubrowser/httpcomm.cpp342
-rw-r--r--noncore/net/ubrowser/httpcomm.h61
-rw-r--r--noncore/net/ubrowser/httpfactory.cpp272
-rw-r--r--noncore/net/ubrowser/httpfactory.h16
-rw-r--r--noncore/net/ubrowser/ubrowser.pro4
5 files changed, 276 insertions, 419 deletions
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp
deleted file mode 100644
index 4f189ce..0000000
--- a/noncore/net/ubrowser/httpcomm.cpp
+++ b/dev/null
@@ -1,342 +0,0 @@
1/*
2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing
3Copyright (C) 2002 Thomas Stephens
4
5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
7version.
8
9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
11Public License for more details.
12
13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free
14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15*/
16
17#include "httpcomm.h"
18
19HttpComm::HttpComm(QSocket *newSocket, QTextBrowser *newBrowser):QObject()
20{
21 socket = newSocket;
22
23 connect(socket, SIGNAL(hostFound()), this, SLOT(hostFound()) );
24 connect(socket, SIGNAL(connected()), this, SLOT(connected()) );
25 connect(socket, SIGNAL(readyRead()), this, SLOT(incoming()) );
26 connect(socket, SIGNAL(connectionClosed()), this, SLOT(connectionClosed()) );
27
28 headerRead=false;
29 length = 0;
30 bRead = 0;
31 chunked=false;
32 lengthset=false;
33
34 browser=newBrowser;
35}
36
37void HttpComm::setUp(QString *newName)
38{
39 name = newName;
40}
41
42void HttpComm::setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText, QImageDrag *newImage, bool newIsImage)
43{
44 host = newHost;
45 portS = newPortS;
46 file = newFile;
47 text = newText;
48 isImage = newIsImage;
49 image = newImage;
50}
51
52void HttpComm::hostFound()
53{
54 printf("HttpComm::hostFound: host found\n");
55}
56
57void HttpComm::connected()
58{
59 QString request("GET " + file + " HTTP/1.1\r\nHost: " + host + ':' + portS + "\r\nConnection: close\r\n\r\n");
60 //QString request("GET " + file + " HTTP/1.0\r\n\r\n");
61 printf("HttpComm::data: bytes written: %d\n", socket->writeBlock(request.latin1(), request.length()) );
62 printf("HttpComm::data: request sent:\n%s", request.latin1());
63
64 headerRead=false;
65 bRead=0;
66 length = 0;
67 header="";
68 body="";
69 chunked=false;
70 lengthset=false;
71}
72
73void HttpComm::incoming()
74{
75 int ba=socket->size(), i=0, j=0, semi=0;
76 char *tempString = new char [ba];
77 int br = socket->readBlock(tempString, ba);
78 socket->flush();
79 bool nextChunk=false;
80 bool done=false;
81 printf("HttpComm::incoming: ba: %d\n", ba);
82 printf("HttpComm::incoming: bytes read from socket: %d\n", br);
83 //printf("HttpComm::incoming: tempString length: %d\n");
84 QString sclength;
85
86 if(headerRead == false)
87 {
88 for(i=0; i<ba; i++)
89 {
90 if(tempString[i] != '\r')
91 {
92 if(tempString[i] == '\n' && header[header.length()-1] == '\n')
93 {
94 j=i;
95 headerRead = true;
96 parseHeader();
97 goto body;
98 }
99 else
100 {
101 header+=tempString[i];
102 }
103 }
104 // printf("%d %d\n", ba, i);
105 }
106 }
107 else
108 {
109 body:
110 printf("HttpComm::incoming: reading body\n");
111 printf("HttpComm::incoming: j is: %d\n", j);
112 if(!chunked)
113 {
114//make sure we didnt just leave that break above...
115 if(j != 0)
116 {
117 for( ; j<ba ; j++)
118 {
119 body+=tempString[j];
120 bRead++;
121 // printf("bRead1: %d\n", bRead);
122 }
123 }
124 else
125 {
126 body += tempString;
127 bRead+=ba;
128 // printf("bRead2: %d\n", bRead);
129 }
130
131 if(bRead >= length)
132 {
133 printf("HttpComm::incoming: finished reading body\n");
134 processBody();
135 socket->close();
136 }
137 }
138 else
139 {
140 int startclength=0;
141 QString tempQString = tempString;
142 //remove the http header, if one exists
143 if(j != 0)
144 {
145 tempQString.remove(0, j+1);
146 printf("HttpComm::incoming: removing http header. Result: \n%s", tempQString.latin1());
147 }
148 while(!done)
149 {
150 switch(status)
151 {
152 //case 0=need to read chunk length
153 case 0:
154 j = tempQString.find('\n');
155 sclength = tempQString;
156 sclength.truncate(j);
157 clength = sclength.toUInt(0, 16);
158 printf("HttpComm::Incoming: chunk length: %d\n", clength);
159 printf("HttpComm::Incoming: chunk length string: %s\n", sclength.latin1());
160 //end of data
161 if(clength==0)
162 {
163 processBody();
164 done=true;
165 return;
166 }
167 //still more, but it hasnt been recieved yet
168 if(ba <= j)
169 {
170 status=2;
171 done=true;
172 break;
173 }
174 //still more data waiting
175 else
176 {
177 done=false;
178 //remove the chunk length header
179 tempQString.remove(0,j+1);
180 }
181 bRead=0;
182 // break;
183 //if there is more fall through to:
184 //chunk length just read, still more in tempQstring
185 case 1:
186 //the current data extends beyond the end of the chunk
187 if(bRead + tempQString.length() > clength)
188 {
189 QString newTQstring = tempQString;
190 newTQstring.truncate(clength-bRead);
191 bRead+=newTQstring.length();
192 body+=newTQstring;
193 printf("HttpComm::incoming: start new body piece 1: \n");
194 printf("%s", newTQstring.latin1() );
195 printf("HttpComm::incoming: end new body piece 1.\n");
196 status=0;
197 tempQString = tempQString.remove(0, newTQstring.length());
198 startclength = tempQString.find('\n');
199 printf("HttpComm::incoming: startclength: %d\n", startclength);
200 tempQString = tempQString.remove(0, startclength+1);
201 done=false;
202 // break;
203 }
204 //the chunk extends beyond the current data;
205 else
206 {
207 if(tempQString.length() <= ba)
208 {
209 printf("HttpComm::incoming: not truncating tempQString\n");
210 body+=tempQString;
211 bRead+=tempQString.length();
212 }
213 else
214 {
215 printf("HttpComm::incoming: truncating tempQString\n");
216 tempQString.truncate(ba);
217 body+=tempQString;
218 bRead+=tempQString.length();
219 }
220 printf("HttpComm::incoming: start new body piece 2: \n");
221 printf("%s", tempQString.latin1() );
222 printf("HttpComm::incoming: end new body piece 2.\n");
223 done=true;
224 status=2;
225 // break;
226 }
227 break;
228 //just got data in, continue reading chunk
229 case 2:
230 //the current data extends beyond the end of the chunk
231 if(bRead + tempQString.length() > clength)
232 {
233 QString newTQstring = tempQString;
234 newTQstring.truncate(clength-bRead);
235 bRead+=newTQstring.length();
236 body+=newTQstring;
237 printf("HttpComm::incoming: start new body piece 3: \n");
238 printf("%s", newTQstring.latin1() );
239 printf("HttpComm::incoming: end new body piece 3.\n");
240 status=0;
241 tempQString = tempQString.remove(0, newTQstring.length());
242 startclength = tempQString.find('\n');
243 printf("HttpComm::incoming: startclength, tempQString length: %d %d\n", startclength, tempQString.length());
244 tempQString = tempQString.remove(0, startclength+1);
245 done=false;
246 // break;
247 }
248 //the chunk extends beyond the current data;
249 else
250 {
251 if(tempQString.length() <= ba)
252 {
253 printf("HttpComm::incoming: not truncating tempQString\n");
254 body+=tempQString;
255 bRead+=tempQString.length();
256 }
257 else
258 {
259 printf("HttpComm::incoming: truncating tempQString\n");
260 tempQString.truncate(ba);
261 body+=tempQString;
262 bRead+=tempQString.length();
263 }
264 printf("HttpComm::incoming: start new body piece 4: \n");
265 printf("%s", tempQString.latin1() );
266 printf("HttpComm::incoming: end new body piece 4.\n");
267 done=true;
268 status=2;
269 // break;
270 }
271 break;
272 }
273 printf("HttpComm::incoming: chunked encoding: bRead: %d\n", bRead);
274 }
275 }
276 }
277 delete tempString;
278}
279
280void HttpComm::connectionClosed()
281{
282 printf("HttpComm::connectionClosed: connection closed\n");
283 processBody();
284}
285
286void HttpComm::parseHeader()
287{
288 QStringList headerLines, tempList;
289 int i;
290
291 printf("HttpComm::parseHeader: start header\n\n");
292 printf("%s", header.latin1());
293 printf("HttpComm::parseHeader: end header\n");
294
295 headerLines = QStringList::split('\n', header);
296
297 for(i=0; i<headerLines.count(); i++)
298 {
299 if(headerLines[i].startsWith("Content-Length:") )
300 {
301 tempList = QStringList::split(':', headerLines[i]);
302 tempList[1].stripWhiteSpace();
303 length = tempList[1].toUInt();
304 }
305 else if(headerLines[i].startsWith("Transfer-Encoding: chunked") )
306 {
307 printf("HttpComm::parseHeader: using chunked encoding\n");
308 chunked = true;
309 status=0;
310 }
311 }
312
313 printf("HttpConn::parseHeader: content-length: %d\n", length);
314}
315
316void HttpComm::processBody()
317{
318 printf("HttpComm::processBody: processing body\n");
319 //printf("HttpComm::processBody: start body\n\n");
320 //printf("%s", body.latin1());
321 //printf("HttpComm::processBody: end body\n");
322
323 int lastSlash = file.findRev('/');
324
325 QString end = file;
326 end.truncate(lastSlash+1);
327 QString context = "http://"+host+':'+portS+end;
328 printf("HttpComm::processBody: context: %s\n", context.latin1() );
329
330 if(!isImage)
331 {
332 browser->setTextFormat(RichText);
333 browser->mimeSourceFactory()->setFilePath(context);
334 browser->setText(body, context);
335 }
336 else
337 {
338 QImage tempImage(body.latin1());
339 image->setImage(tempImage);
340 browser->update();
341 }
342}
diff --git a/noncore/net/ubrowser/httpcomm.h b/noncore/net/ubrowser/httpcomm.h
deleted file mode 100644
index d6f63fc..0000000
--- a/noncore/net/ubrowser/httpcomm.h
+++ b/dev/null
@@ -1,61 +0,0 @@
1/*
2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing
3Copyright (C) 2002 Thomas Stephens
4
5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
7version.
8
9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
11Public License for more details.
12
13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free
14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15*/
16
17#include <qobject.h>
18#include <qstring.h>
19#include <qsocket.h>
20#include <qstringlist.h>
21#include <qdragobject.h>
22#include <qtextbrowser.h>
23#include <qcstring.h>
24#include <qimage.h>
25
26#include <stdio.h>
27
28class HttpComm : public QObject
29{
30Q_OBJECT
31public:
32 HttpComm(QSocket *newSocket, QTextBrowser *newBrowser);
33 void setUp(QString *newName);
34 void setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText, QImageDrag *newImage, bool newIsImage);
35 void parseHeader();
36 void processBody();
37public slots:
38 void hostFound();
39 void connected();
40 void connectionClosed();
41 void incoming();
42private:
43 QString *name;
44 QSocket *socket;
45 QString host;
46 QString portS;
47 QString file;
48 bool headerRead;
49 QString header;
50 QString body;
51 unsigned int length;
52 unsigned int bRead;
53 QTextDrag *text;
54 QImageDrag *image;
55 QTextBrowser *browser;
56 bool chunked;
57 bool lengthset;
58 unsigned int clength;
59 int status;
60 bool isImage;
61};
diff --git a/noncore/net/ubrowser/httpfactory.cpp b/noncore/net/ubrowser/httpfactory.cpp
index 50a3c9a..0586e96 100644
--- a/noncore/net/ubrowser/httpfactory.cpp
+++ b/noncore/net/ubrowser/httpfactory.cpp
@@ -1,117 +1,365 @@
1/* 1/*
2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing 2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing
3Copyright (C) 2002 Thomas Stephens 3Copyright (C) 2002 Thomas Stephens
4 4
5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public 5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later 6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
7version. 7version.
8 8
9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
11Public License for more details. 11Public License for more details.
12 12
13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free 13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free
14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15*/ 15*/
16 16
17#include "httpfactory.h" 17#include "httpfactory.h"
18 18
19HttpFactory::HttpFactory(QTextBrowser *newBrowser):QMimeSourceFactory() 19HttpFactory::HttpFactory(QTextBrowser *newBrowser):QMimeSourceFactory()
20{ 20{
21 socket = new QSocket; 21 //socket = new QSocket;
22 text = new QTextDrag; 22 text = new QTextDrag;
23 browser=newBrowser; 23 browser=newBrowser;
24 comm = new HttpComm(socket, browser); 24 //comm = new HttpComm(socket, browser);
25 image = new QImageDrag; 25 image = new QImageDrag;
26} 26}
27 27
28const QMimeSource * HttpFactory::data(const QString &abs_name) const 28const QMimeSource * HttpFactory::data(const QString &abs_name) const
29{ 29{
30 printf("HttpFactory::data: using absolute data func\n"); 30 printf("HttpFactory::data: using absolute data func\n");
31 31
32 int port=80, addrEnd, portSep; 32 int port=80, addrEnd, portSep;
33 QString host, file, portS, name, tempString; 33 QString host, file, portS, name, tempString;
34 bool done=false, isImage=false; 34 bool done=false, isText=true;
35 35
36 comm->setUp((QString *)&abs_name); 36 //comm->setUp((QString *)&abs_name);
37 37
38 name = abs_name; 38 name = abs_name;
39 //name = name.lower(); 39 //name = name.lower();
40 name = name.stripWhiteSpace(); 40 name = name.stripWhiteSpace();
41 41
42 printf("%s\n", name.latin1()); 42 printf("%s\n", name.latin1());
43 43
44 if(name.startsWith("http://")) 44 if(name.startsWith("http://"))
45 { 45 {
46 name = name.remove(0, 7); 46 name = name.remove(0, 7);
47 } 47 }
48 else 48 else
49 { 49 {
50 name.prepend(browser->context()); 50 name.prepend(browser->context());
51 name = name.remove(0, 7); 51 name = name.remove(0, 7);
52 } 52 }
53 53
54 addrEnd = name.find('/'); 54 addrEnd = name.find('/');
55 if(addrEnd == -1) 55 if(addrEnd == -1)
56 { 56 {
57 name += '/'; 57 name += '/';
58 addrEnd = name.length()-1; 58 addrEnd = name.length()-1;
59 } 59 }
60 60
61 host = name; 61 host = name;
62 file = name; 62 file = name;
63 63
64 host.truncate(addrEnd); 64 host.truncate(addrEnd);
65 file.remove(0, addrEnd); 65 file.remove(0, addrEnd);
66 66
67 portSep = host.find(':'); 67 portSep = host.find(':');
68 if(portSep != -1) 68 if(portSep != -1)
69 { 69 {
70 portS=host; 70 portS=host;
71 host.truncate(portSep); 71 host.truncate(portSep);
72 portS.remove(0, portSep+1); 72 portS.remove(0, portSep+1);
73 port = portS.toInt(); 73 port = portS.toInt();
74 } 74 }
75 75
76 printf("%s %s %d\n", host.latin1(), file.latin1(), port); 76 printf("%s %s %d\n", host.latin1(), file.latin1(), port);
77 77
78 if(port == 80) 78 if(port == 80)
79 { 79 {
80 portS="80"; 80 portS="80";
81 } 81 }
82 82
83 if(file.find(".png", file.length()-4) != -1 || file.find(".gif", file.length()-4) != -1 || file.find(".jpg", file.length()-4) != -1) 83 //if(file.find(".png", file.length()-4) != -1 || file.find(".gif", file.length()-4) != -1 || file.find(".jpg", file.length()-4) != -1)
84 { 84 //{
85 isImage=true; 85 // isImage=true;
86 } 86 //}
87 87
88 comm->setStuff(host, portS, file, text, image, isImage); 88 //comm->setStuff(host, portS, file, text, image, isImage);
89 89
90 socket->connectToHost(host, port); 90 //socket->connectToHost(host, port);
91
92 int con, bytesSent;
93 struct sockaddr_in serverAddr;
94 struct hostent * serverInfo = gethostbyname( host.latin1() );
95
96 if( serverInfo == NULL )
97 {
98 QMessageBox *mb = new QMessageBox("Error!",
99 "couldnt find ip address",
100 QMessageBox::NoIcon,
101 QMessageBox::Ok,
102 QMessageBox::NoButton,
103 QMessageBox::NoButton);
104 mb->exec();
105 perror("HttpFactory::data:");
106 return 0;
107 }
108
109 QByteArray data;
110 printf( "HttpFactory::data: %s\n", inet_ntoa(*((struct in_addr *)serverInfo->h_addr )) );
111
112 QString request("GET " + file + " HTTP/1.1\r\nHost: " + host + ':' + portS + "\r\nConnection: close\r\n\r\n");
113
114 con = socket( AF_INET, SOCK_STREAM, 0 );
115 if( con == -1 )
116 {
117 QMessageBox *mb = new QMessageBox("Error!",
118 "couldnt create socket",
119 QMessageBox::NoIcon,
120 QMessageBox::Ok,
121 QMessageBox::NoButton,
122 QMessageBox::NoButton);
123 mb->exec();
124 perror("HttpFactory::data:");
125 return 0;
126 }
127
128 serverAddr.sin_family = AF_INET;
129 serverAddr.sin_port = htons( port );
130 serverAddr.sin_addr.s_addr = inet_addr( inet_ntoa(*((struct in_addr *)serverInfo->h_addr )) );
131 memset( &(serverAddr.sin_zero), '\0', 8 );
132
133 if(::connect( con, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr)) == -1 )
134 {
135 QMessageBox *mb = new QMessageBox("Error!",
136 "couldnt connect to socket",
137 QMessageBox::NoIcon,
138 QMessageBox::Ok,
139 QMessageBox::NoButton,
140 QMessageBox::NoButton);
141 mb->exec();
142 perror("HttpFactory::data:");
143 return 0;
144 }
91 145
92 if(!image) 146
147 bytesSent = send( con, request.latin1(), request.length(), 0);
148 printf("HttpFactory::data: bytes written: %d out of: %d\n", bytesSent, request.length() );
149 printf("HttpFactory::data: request sent:\n%s", request.latin1());
150
151 data = this->processResponse( con, isText );
152
153 ::close( con );
154
155 if(isText)
93 { 156 {
94 text->setText(""); 157 text->setText( QString( data ) );
95 return text; 158 return text;
96 } 159 }
97 else 160 else
98 { 161 {
162 image->setImage( QImage( data ) );
99 return image; 163 return image;
100 } 164 }
101} 165}
102 166
103const QMimeSource * HttpFactory::data(const QString &abs_or_rel_name, const QString & context) const 167const QMimeSource * HttpFactory::data(const QString &abs_or_rel_name, const QString & context) const
104{ 168{
105 printf("HttpFactory::data: using relative data func\n"); 169 printf("HttpFactory::data: using relative data func\n");
106 170
107 if(abs_or_rel_name.startsWith(context)) 171 if(abs_or_rel_name.startsWith(context))
108 { 172 {
109 return data(abs_or_rel_name); 173 return data(abs_or_rel_name);
110 } 174 }
111 else 175 else
112 { 176 {
113 return data(context + abs_or_rel_name); 177 return data(context + abs_or_rel_name);
114 } 178 }
115 179
116 return 0; 180 return 0;
117} 181}
182
183const QByteArray HttpFactory::processResponse( int sockfd, bool &isText ) const
184{
185 QByteArray inputBin( 1 );
186 QByteArray conClosedErr( 27 );
187 char conClosedErrMsg[] = "Connection to server closed";
188 QString currentLine;
189 bool done=false, chunked=false;
190 int dataLength = 0;
191
192 for( int i = 0; i < 27; i++)
193 {
194 conClosedErr[i] = conClosedErrMsg[i];
195 }
196
197 while( !done )
198 {
199 recv( sockfd, inputBin.data(), inputBin.size(), 0 );
200 currentLine += *(inputBin.data());
201
202 if( *(inputBin.data()) == '\n' )
203 {
204 if( currentLine.isEmpty() || currentLine.startsWith( "\r") )
205 {
206 printf( "HttpFactory::processResponse: end of header\n" );
207 if( chunked )
208 {
209 return recieveChunked( sockfd );
210 } else {
211 return recieveNormal( sockfd, dataLength );
212 }
213 done = true;
214 }
215
216 if( currentLine.contains( "Transfer-Encoding: chunked", false) >= 1 )
217 {
218 chunked = true;
219 printf( "HttpFactory::processResponse: chunked encoding\n" );
220 }
221
222 if( currentLine.contains( "Content-Type: text", false ) >= 1 )
223 {
224 isText = true;
225 printf( "HttpFactory::processResponse: content type text\n" );
226 }
227
228 if( currentLine.contains( "Content-Type: image", false ) >= 1 )
229 {
230 isText = false;
231 printf( "HttpFactory::processResponse: content type image\n" );
232 }
233
234 if( currentLine.contains( "Content-Length", false ) >= 1 )
235 {
236 currentLine.remove( 0, 16 );
237 dataLength = currentLine.toInt();
238 printf( "HttpFactory::processResponse: content length: %d\n", dataLength );
239 }
240
241 currentLine = "";
242 printf("HttpFactory::processResponse: reseting currentLine: %s\n", currentLine.latin1() );
243 }
244 }
245}
246
247const QByteArray HttpFactory::recieveNormal( int sockfd, int dataLen ) const
248{
249 printf( "HttpFactory::recieveNormal: recieving w/out chunked encoding\n" );
250
251 QByteArray data( dataLen );
252 QByteArray temp( dataLen );
253 int recieved, i;
254
255 recieved = recv( sockfd, temp.data(), temp.size(), 0 );
256 printf( "HttpFactory::recieveNormal: found some data: %s\n", (char *)temp.data() );
257 for( i = 0; i < recieved; i++ )
258 {
259 data[i] = temp[i];
260 }
261 dataLen -= recieved;
262 while( dataLen > 0 )
263 {
264 recieved = recv( sockfd, temp.data(), temp.size(), 0 );
265 dataLen -= recieved;
266 // printf( "HttpFactory::recieveNormal: found some more data: %s\n", (char *)temp.data() );
267 for( int j = 0; j < recieved; j++ )
268 {
269 data[i] = temp[j];
270 i++;
271 }
272 temp.fill('\0');
273 }
274
275 printf( "HttpFactory::recieveNormal: end of data\n" );
276 return data;
277}
278
279const QByteArray HttpFactory::recieveChunked( int sockfd ) const
280{
281 printf( "HttpFactory::recieveChunked: recieving data with chunked encoding\n" );
282
283 QByteArray data;
284 QByteArray temp( 1 );
285 int recieved, i = 0, cSize = 0;
286 QString cSizeS;
287
288 printf( "HttpFactory::recieveChunked: temp.size(): %d\n", temp.size() );
289 recv( sockfd, temp.data(), temp.size(), 0 );
290 while( *(temp.data()) != '\n' && *(temp.data()) != ';' )
291 {
292 // printf( "HttpFactory::recieveChunked: temp.size(): %d\n", temp.size() );
293 // printf( "HttpFactory::recieveChunked: temp.data(): %c\n", temp[0] );
294 cSizeS += temp[0];
295 recv( sockfd, temp.data(), temp.size(), 0 );
296 }
297
298 printf( "HttpFactory::recieveChunked: cSizeS: %s\n", cSizeS.latin1() );
299 cSize = cSizeS.toInt( 0, 16 );
300 printf( "HttpFactory::recieveChunked: first chunk of size: %d\n", cSize );
301
302 if( *(temp.data()) == ';' )
303 {
304 while( *(temp.data()) != '\n' )
305 {
306 recv( sockfd, temp.data(), temp.size(), 0 );
307 }
308 }
309
310 temp.fill( '\0', cSize );
311 data.fill( '\0', cSize );
312
313 while( cSize > 0 )
314 {
315 while( cSize > 0 )
316 {
317 recieved = recv( sockfd, temp.data(), temp.size(), 0 );
318 cSize -= recieved;
319 for( int j = 0; j < recieved; j++ )
320 {
321 data[i] = temp[j];
322 i++;
323 }
324 temp.fill('\0', cSize);
325 }
326
327 printf( "HttpFactory::recieveChunked: current data:\n%s", data.data() );
328
329 temp.fill('\0', 1);
330 cSizeS = "";
331 cSize = 0;
332
333 recv( sockfd, temp.data(), temp.size(), 0 );
334 if( *(temp.data()) == '\r' )
335 {
336 recv( sockfd, temp.data(), temp.size(), 0 );
337 }
338 recv( sockfd, temp.data(), temp.size(), 0 );
339 while( *(temp.data()) != '\n' && *(temp.data()) != ';' )
340 {
341 // printf( "HttpFactory::recieveChunked: temp.size(): %d\n", temp.size() );
342 printf( "HttpFactory::recieveChunked: temp.data(): %d\n", temp[0] );
343 cSizeS += temp[0];
344 recv( sockfd, temp.data(), temp.size(), 0 );
345 }
346
347 printf( "HttpFactory::recieveChunked: cSizeS: %s\n", cSizeS.latin1() );
348 cSize = cSizeS.toInt( 0, 16 );
349 printf( "HttpFactory::recieveChunked: next chunk of size: %d\n", cSize );
350
351 if( *(temp.data()) == ';' )
352 {
353 while( *(temp.data()) != '\n' )
354 {
355 recv( sockfd, temp.data(), temp.size(), 0 );
356 }
357 }
358
359 temp.fill( '\0', cSize );
360 data.resize( data.size() + cSize );
361 }
362
363 printf( "HttpFactory::recieveChunked: end of data\n" );
364 return data;
365}
diff --git a/noncore/net/ubrowser/httpfactory.h b/noncore/net/ubrowser/httpfactory.h
index 1802f56..214120c 100644
--- a/noncore/net/ubrowser/httpfactory.h
+++ b/noncore/net/ubrowser/httpfactory.h
@@ -1,39 +1,51 @@
1/* 1/*
2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing 2Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing
3Copyright (C) 2002 Thomas Stephens 3Copyright (C) 2002 Thomas Stephens
4 4
5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public 5This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public
6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later 6License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later
7version. 7version.
8 8
9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 9This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 10implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
11Public License for more details. 11Public License for more details.
12 12
13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free 13You should have received a copy of the GNU General Public License along with this program; if not, write to the Free
14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 14Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15*/ 15*/
16 16
17#include <qmime.h> 17#include <qmime.h>
18#include <qsocket.h> 18//#include <qsocket.h>
19#include <qstring.h> 19#include <qstring.h>
20#include <qdragobject.h> 20#include <qdragobject.h>
21#include <qtextbrowser.h> 21#include <qtextbrowser.h>
22#include <qmessagebox.h>
22 23
23#include <stdio.h> 24#include <stdio.h>
24 25
26#include <sys/types.h>
27#include <sys/socket.h>
28#include <unistd.h>
29#include <netinet/in.h>
30#include <netdb.h>
31#include <arpa/inet.h>
32
25#include "httpcomm.h" 33#include "httpcomm.h"
26 34
27class HttpFactory : public QMimeSourceFactory 35class HttpFactory : public QMimeSourceFactory
28{ 36{
29public: 37public:
30 HttpFactory(QTextBrowser *newBrowser); 38 HttpFactory(QTextBrowser *newBrowser);
31 const QMimeSource * data(const QString &abs_name) const; 39 const QMimeSource * data(const QString &abs_name) const;
32 const QMimeSource * data(const QString &abs_or_rel_name, const QString & context) const; 40 const QMimeSource * data(const QString &abs_or_rel_name, const QString & context) const;
33private: 41private:
34 QSocket *socket; 42 //QSocket *socket;
35 HttpComm *comm; 43 HttpComm *comm;
36 QTextDrag *text; 44 QTextDrag *text;
37 QImageDrag *image; 45 QImageDrag *image;
38 QTextBrowser *browser; 46 QTextBrowser *browser;
47
48 const QByteArray processResponse( int sockfd, bool &isText) const;
49 const QByteArray recieveNormal( int sockfd, int dataLen ) const;
50 const QByteArray recieveChunked( int sockfd ) const;
39}; 51};
diff --git a/noncore/net/ubrowser/ubrowser.pro b/noncore/net/ubrowser/ubrowser.pro
index cd1a989..a6943dd 100644
--- a/noncore/net/ubrowser/ubrowser.pro
+++ b/noncore/net/ubrowser/ubrowser.pro
@@ -1,13 +1,13 @@
1 TEMPLATE=app 1 TEMPLATE=app
2 CONFIG +=qt warn_on release 2 CONFIG +=qt warn_on release
3 DESTDIR =../../../bin 3 DESTDIR =../../../bin
4 HEADERS = mainview.h httpfactory.h httpcomm.h 4 HEADERS = mainview.h httpfactory.h
5 SOURCES = main.cpp mainview.cpp httpfactory.cpp httpcomm.cpp 5 SOURCES = main.cpp mainview.cpp httpfactory.cpp
6 INCLUDEPATH+=../../../include 6 INCLUDEPATH+=../../../include
7 DEPENDPATH+=../../../include 7 DEPENDPATH+=../../../include
8 LIBS += -lqpe 8 LIBS += -lqpe
9TARGET = ubrowser 9TARGET = ubrowser
10 10
11 11
12 12
13include ( $(OPIEDIR)/include.pro ) 13include ( $(OPIEDIR)/include.pro )