ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/Search/HttpHandler.cpp
(Generate patch)

Comparing trunk/Search/HttpHandler.cpp (file contents):
Revision 19 by douglas, 2002-12-10T00:02:22-08:00 vs.
Revision 25 by douglas, 2002-12-22T23:32:58-08:00

# Line 62 | Line 62 | HttpHandler::HttpHandler()
62          }
63   #endif // _WIN32
64  
65        begin = 0;
65          length = 0;
66          chunked = false;
67   }
# Line 76 | Line 75 | HttpHandler::~HttpHandler()
75   #endif // _WIN32
76   }
77  
78 < bool HttpHandler::handle(URL &url, bool head)
78 > bool HttpHandler::handle(URL &url, const string referer, bool head)
79   {
80          bool answer = false;
81  
# Line 133 | Line 132 | bool HttpHandler::handle(URL &url, bool
132                  delete [] port;
133          }
134  
135 < //      putline("Referer: " + ?referer?);
135 >        if (referer != "")
136 >        {
137 >                putline("Referer: " + referer);
138 >        }
139 >
140          putline("Connection: close");
141          putline();
142  
# Line 156 | Line 159 | bool HttpHandler::handle(URL &url, bool
159                  unsigned minor = strtoul(line.substr(dot + 1, space - dot - 1).c_str(),
160                          0, 10);
161  
162 <                if (major > 1 || minor < 1)
162 >                if (major > 1)
163                  {
164                          cerr << program << ": Potentially Incompatible Server: HTTP/" <<
165                                  major << "." << minor << "\n";
# Line 240 | Line 243 | bool HttpHandler::handle(URL &url, bool
243  
244   HttpHandler& HttpHandler::getline(string& line, char endline)
245   {
246 <        int end = page.find(endline, begin);
247 <        int newline = page.find('\n', begin);
246 >        unsigned end = page.find(endline);
247 >        unsigned newline = page.find('\n');
248  
249          if (newline < end || end == string::npos)
250          {
251                  end = newline;
252          }
253  
254 <        line = page.substr(begin, end - begin);
255 <
253 <        if (end == string::npos)
254 <        {
255 <                begin = end;
256 <        }
257 <        else
258 <        {
259 <                begin = end + 1;
260 <        }
254 >        line = page.substr(0, end);
255 >        page.erase(0, (end == string::npos ? end : end + 1));
256  
257          return *this;
258   }
259  
265 bool HttpHandler::good()
266 {
267        bool answer = true;
268
269        if (begin >= page.length())
270        {
271                answer = false;
272        }
273        else if (begin == string::npos)
274        {
275                answer = false;
276        }
277
278        return answer;
279 }
280
260   void HttpHandler::clear()
261   {
262          closesocket(http);
# Line 285 | Line 264 | void HttpHandler::clear()
264          type = "";
265          length = 0;
266          location = "";
288        begin = 0;
267          page = "";
268          chunked = false;
269   }
# Line 301 | Line 279 | void HttpHandler::populate()
279                          memset(buffer, 0, BUFSIZ + 1);
280  
281                          unsigned bytes = left > BUFSIZ ? BUFSIZ : left;
282 +                        unsigned received;
283  
284 <                        if (recv(http, buffer, bytes, 0) == SOCKET_ERROR)
284 >                        if ((received = recv(http, buffer, bytes, 0)) == SOCKET_ERROR)
285                          {
286 <                                error(program + ": Revc");
286 >                                error(program + ": Recv");
287                                  exit(1);
288                          }
289 +                        else if (received != bytes)
290 +                        {
291 +                                left -= received;
292 +                                page += buffer;
293 +
294 +                                memset(buffer, 0, BUFSIZ + 1);
295 +
296 +                                bytes -= received;
297 +                                if (recv(http, buffer, bytes, 0) == SOCKET_ERROR)
298 +                                {
299 +                                        error(program + ": Recv");
300 +                                        exit(1);
301 +                                }
302 +                        }
303  
304                          page += buffer;
305                          left -= bytes;
# Line 314 | Line 307 | void HttpHandler::populate()
307          }
308          else
309          {
310 <                //
310 >                unsigned chunk;
311 >
312 >                do
313 >                {
314 >                        chunk = strtoul(getline().c_str(), 0, 16);
315 >
316 >                        unsigned left = chunk;
317 >
318 >                        while (left > 0)
319 >                        {
320 >                                memset(buffer, 0, BUFSIZ + 1);
321 >
322 >                                unsigned bytes = left > BUFSIZ ? BUFSIZ : left;
323 >                                unsigned received;
324 >
325 >                                if ((received = recv(http, buffer, bytes, 0)) == SOCKET_ERROR)
326 >                                {
327 >                                        error(program + ": Recv");
328 >                                        exit(1);
329 >                                }
330 >                                else if (received != bytes)
331 >                                {
332 >                                        left -= received;
333 >                                        page += buffer;
334 >
335 >                                        memset(buffer, 0, BUFSIZ + 1);
336 >
337 >                                        bytes -= received;
338 >                                        if (recv(http, buffer, bytes, 0) == SOCKET_ERROR)
339 >                                        {
340 >                                                error(program + ": Recv");
341 >                                                exit(1);
342 >                                        }
343 >                                }
344 >
345 >                                page += buffer;
346 >                                left -= bytes;
347 >                        }
348 >
349 >                        getline();
350 >                        length += chunk;
351 >                }
352 >                while (chunk > 0);
353          }
354  
355 <        cerr << "\n[" << page << "]\n";
355 >        for (unsigned index = 0; index < page.length(); index++)
356 >        {
357 >                if (page[index] == '\r' && (index + 1 < page.length()) ? page[index +
358 >                        1] == '\n' : false)
359 >                {
360 >                        page.erase(index, 1);
361 >                }
362 >                else if (page[index] == '\r')
363 >                {
364 >                        page[index] = '\n';
365 >                }
366 >        }
367   }
368  
369   void HttpHandler::putline(const string line)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines