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 17 by douglas, 2002-12-09T18:31:11-08:00 vs.
Revision 20 by douglas, 2002-12-10T14:04:39-08:00

# Line 62 | Line 62 | HttpHandler::HttpHandler()
62          }
63   #endif // _WIN32
64  
65 <        begin = 0;
65 >        length = 0;
66 >        chunked = false;
67   }
68  
69   HttpHandler::~HttpHandler()
# Line 131 | Line 132 | bool HttpHandler::handle(URL &url, bool
132                  delete [] port;
133          }
134  
135 + //      putline("Referer: " + ?referer?);
136 +        putline("Connection: close");
137          putline();
138  
139 <        string line = getline();
139 >        code response;
140 >        string line;
141  
142 <        if (line.find("HTTP/") != 0)
142 >        do
143          {
144 <                return answer;
141 <        }
144 >                line = getline();
145  
146 <        unsigned dot = line.find('.');
147 <        unsigned space = line.find(' ');
146 >                if (line.find("HTTP/") != 0)
147 >                {
148 >                        return answer;
149 >                }
150  
151 <        unsigned major = strtoul(line.substr(5, dot - 5).c_str(), 0, 0);
152 <        unsigned minor = strtoul(line.substr(dot + 1, space - dot - 1).c_str(), 0,
148 <                0);
151 >                unsigned dot = line.find('.');
152 >                unsigned space = line.find(' ');
153  
154 <        if (major > 1 || minor < 1)
155 <        {
156 <                cerr << program << ": Potentially Incompatible Server: HTTP/" << major
153 <                        << "." << minor << "\n";
154 >                unsigned major = strtoul(line.substr(5, dot - 5).c_str(), 0, 10);
155 >                unsigned minor = strtoul(line.substr(dot + 1, space - dot - 1).c_str(),
156 >                        0, 10);
157  
158 <                return answer;
159 <        }
158 >                if (major > 1 || minor < 1)
159 >                {
160 >                        cerr << program << ": Potentially Incompatible Server: HTTP/" <<
161 >                                major << "." << minor << "\n";
162  
163 <        code response = code(strtoul(line.substr(space + 1).c_str(), 0, 0));
163 >                        return answer;
164 >                }
165 >
166 >                response = code(strtoul(line.substr(space + 1).c_str(), 0, 10));
167 >
168 >                if (response < ok) do line = getline(); while (line != "");
169 >        }
170 >        while (response < ok);
171  
172          do
173          {
174                  line = getline();
175 +
176 +                if (line != "")
177 +                {
178 +                        unsigned colon = line.find(':');
179 +
180 +                        string field = line.substr(0, colon);
181 +                        string value = line.substr(colon + 1);
182 +
183 +                        while (isspace(value[0])) value.erase(0, 1);
184 +
185 +                        if (field == "Content-Type")
186 +                        {
187 +                                type = value;
188 +                        }
189 +                        else if (field == "Content-Length")
190 +                        {
191 +                                length = strtoul(value.c_str(), 0, 10);
192 +                        }
193 +                        else if (field == "Location")
194 +                        {
195 +                                location = value;
196 +                        }
197 +                        else if (field == "Transfer-Encoding")
198 +                        {
199 +                                chunked = value == "chunked";
200 +                        }
201 +                }
202          }
203          while (line != "");
204  
205          switch (response)
206          {
207          case ok:
208 +                if (debug) cerr << "response = " << response << "\n";
209                  answer = true;
210                  break;
211 <        case choices:
172 <                break;
211 >        case choices:
212          case moved:
174                break;
213          case found:
214 +                if (debug) cerr << "response = " << response << "\n"
215 +                        << "location = " << location << "\n";
216 +                location = getLink(location, url);
217                  break;
218          case notfound:
178                break;
219          case internal:
220 +                if (debug) cerr << "response = " << response << "\n";
221                  break;
222          default:
223 +                if (debug) cerr << "response = " << response << "\n";
224 +                if (response <= 299)
225 +                {
226 +                        answer = true;
227 +                }
228 +                else if (response <= 399)
229 +                {
230 +                        location = getLink(location, url);
231 +                }
232                  break;
233          }
234  
235 +        if (!head && answer) populate();
236 +
237          return answer;
238   }
239  
240   HttpHandler& HttpHandler::getline(string& line, char endline)
241   {
242 <        int end = page.find(endline, begin);
243 <        int newline = page.find('\n', begin);
242 >        int end = page.find(endline);
243 >        int newline = page.find('\n');
244  
245          if (newline < end || end == string::npos)
246          {
247                  end = newline;
248          }
249  
250 <        line = page.substr(begin, end - begin);
250 >        line = page.substr(0, end);
251 >        page.erase(0, (end == string::npos ? end : end + 1));
252  
253 <        if (end == string::npos)
254 <        {
202 <                begin = end;
203 <        }
204 <        else
205 <        {
206 <                begin = end + 1;
207 <        }
253 > //      if (line == "") cerr << "line = [" << line << "]\npage = [" << page
254 > //              << "]" << (good() ? "true" : "false") << "\n";
255  
256          return *this;
257   }
258  
259 < bool HttpHandler::good()
259 > void HttpHandler::clear()
260   {
261 <        bool answer = true;
261 >        closesocket(http);
262 >
263 >        type = "";
264 >        length = 0;
265 >        location = "";
266 >        page = "";
267 >        chunked = false;
268 > }
269  
270 <        if (begin >= page.length())
270 > void HttpHandler::populate()
271 > {
272 >        if (!chunked)
273          {
274 <                answer = false;
274 >                unsigned left = length;
275 >
276 >                while (left > 0)
277 >                {
278 >                        memset(buffer, 0, BUFSIZ + 1);
279 >
280 >                        unsigned bytes = left > BUFSIZ ? BUFSIZ : left;
281 >
282 >                        if (recv(http, buffer, bytes, 0) == SOCKET_ERROR)
283 >                        {
284 >                                error(program + ": Recv");
285 >                                exit(1);
286 >                        }
287 >
288 >                        page += buffer;
289 >                        left -= bytes;
290 >                }
291          }
292 <        else if (begin == string::npos)
292 >        else
293          {
294 <                answer = false;
223 <        }
294 >                unsigned chunk;
295  
296 <        return answer;
297 < }
296 >                do
297 >                {
298 >                        chunk = strtoul(getline().c_str(), 0, 16);
299  
300 < void HttpHandler::clear()
301 < {
302 <        type = "";
303 <        length = 0;
304 <        location = "";
305 <        begin = 0;
306 <        page = "";
300 >                        unsigned left = chunk;
301 >
302 >                        while (left > 0)
303 >                        {
304 >                                memset(buffer, 0, BUFSIZ + 1);
305 >
306 >                                unsigned bytes = left > BUFSIZ ? BUFSIZ : left;
307 >
308 >                                if (recv(http, buffer, bytes, 0) == SOCKET_ERROR)
309 >                                {
310 >                                        error(program + ": Recv");
311 >                                        exit(1);
312 >                                }
313 >
314 >                                page += buffer;
315 >                                left -= bytes;
316 >                        }
317 >
318 >                        getline();
319 >                        length += chunk;
320 >                }
321 >                while (chunk > 0);
322 >        }
323 >
324 >        for (unsigned index = 0; index < page.length(); index++)
325 >        {
326 >                if (page[index] == '\r' && (index + 1 < page.length()) ? page[index +
327 >                        1] == '\n' : false)
328 >                {
329 >                        page.erase(index, 1);
330 >                }
331 >                else if (page[index] == '\r')
332 >                {
333 >                        page[index] = '\n';
334 >                }
335 >        }
336   }
337  
338   void HttpHandler::putline(const string line)
# Line 266 | Line 367 | string HttpHandler::getline()
367          return line;
368   }
369  
370 < void HttpHandler::error(const string prefix, bool host)
370 > void HttpHandler::error(const string& prefix, bool host)
371   {
372   #ifdef _WIN32
373          string error;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines