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 13 by douglas, 2002-12-06T19:56:56-08:00 vs.
Revision 18 by douglas, 2002-12-09T21:40:12-08:00

# Line 52 | Line 52
52  
53   HttpHandler::HttpHandler()
54   {
55 +        buffer = new char[BUFSIZ + 1];
56 +
57   #ifdef _WIN32
58 <        WSADATA data;
57 <        if (WSAStartup(MAKEWORD(2, 0) != 0, &data))
58 >        if (WSAStartup(MAKEWORD(2, 0), &data) != 0)
59          {
60 <                error(program + ": WSAStartup()");
60 >                error(program + ": WSAStartup");
61                  exit(1);
62          }
63   #endif // _WIN32
64  
65          begin = 0;
66 +        length = 0;
67 +        chunked = false;
68   }
69  
70   HttpHandler::~HttpHandler()
71   {
72 +        delete [] buffer;
73 +
74   #ifdef _WIN32
75          WSACleanup();
76   #endif // _WIN32
77   }
78  
79 < bool HttpHandler::connect(URL &url, bool head)
79 > bool HttpHandler::handle(URL &url, bool head)
80   {
81          bool answer = false;
82  
83 < //      if (status != JNI_ERR)
84 < //      {
85 < //              if (cls != 0)
86 < //              {
87 < //                      if (mid != 0)
88 < //                      {
89 < //                              jstring addressJ = env->NewStringUTF(url.getAddress().c_str());
90 < //                              jint portJ = url.getPort();
91 < //                              jstring pathJ = env->NewStringUTF(url.getPath().c_str());
92 < //                              jstring programNameJ = env->NewStringUTF(programName.c_str());
93 < //                              jstring programVersionJ =
94 < //                                      env->NewStringUTF(programVersion.c_str());
95 <
96 < //                              jstring pageJ = (jstring)env->CallStaticObjectMethod(cls, mid,
97 < //                                      addressJ, portJ, pathJ, programNameJ, programVersionJ);
98 <
99 < //                              const char* pageC = env->GetStringUTFChars(pageJ, 0);
100 < //                              page = pageC;
101 < //                              env->ReleaseStringUTFChars(pageJ, pageC);
102 <
103 < //                              if (page != "unknown host\n" && page != "io exception\n" &&
104 < //                                      page != "bad headers\n") answer = true;
105 < //                      }
106 < //              }
107 < //      }
83 >        if ((http = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
84 >        {
85 >                error(program + ": Socket");
86 >                exit(1);
87 >        }
88 >
89 >        sockaddr_in address;
90 >        hostent* host;
91 >
92 >        address.sin_family = AF_INET;
93 >
94 >        if ((host = gethostbyname(url.getAddress().c_str())) == NULL)
95 >        {
96 >                error(program + ": Host: " + url.getAddress(), true);
97 >                return answer;
98 >        }
99 >
100 >        address.sin_addr = *((in_addr*)*host->h_addr_list);
101 >        address.sin_port = htons(url.getPort());
102 >
103 >        if (connect(http, (sockaddr*)&address, sizeof(sockaddr_in)) ==
104 >                SOCKET_ERROR)
105 >        {
106 >                error(program + ": Connect");
107 >                return answer;
108 >        }
109 >
110 >        if (head)
111 >        {
112 >                putline("HEAD " + url.getPath() + " HTTP/1.1");
113 >        }
114 >        else
115 >        {
116 >                putline("GET " + url.getPath() + " HTTP/1.1");
117 >        }
118 >
119 >        putline("Accept: text/html; text/plain");
120 >        putline("User-Agent: " + agent(true) + ' ' + platform());
121 >
122 >        if (url.getPort() == 80)
123 >        {
124 >                putline("Host: " + url.getAddress());
125 >        }
126 >        else
127 >        {
128 >                char* port = new char[1024];
129 >                sprintf(port, "%u", url.getPort());
130 >
131 >                putline("Host: " + url.getAddress() + ':' + port);
132 >
133 >                delete [] port;
134 >        }
135 >
136 >        putline("Connection: close");
137 >        putline();
138 >
139 >        code response;
140 >        string line;
141 >
142 >        do
143 >        {
144 >                line = getline();
145 >
146 >                if (line.find("HTTP/") != 0)
147 >                {
148 >                        return answer;
149 >                }
150 >
151 >                unsigned dot = line.find('.');
152 >                unsigned space = line.find(' ');
153 >
154 >                unsigned major = strtoul(line.substr(5, dot - 5).c_str(), 0, 0);
155 >                unsigned minor = strtoul(line.substr(dot + 1, space - dot - 1).c_str(), 0,
156 >                        0);
157 >
158 >                if (major > 1 || minor < 1)
159 >                {
160 >                        cerr << program << ": Potentially Incompatible Server: HTTP/" << major
161 >                                << "." << minor << "\n";
162 >
163 >                        return answer;
164 >                }
165 >
166 >                response = code(strtoul(line.substr(space + 1).c_str(), 0, 0));
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 =
186 >                }
187 >        }
188 >        while (line != "");
189 >
190 >        switch (response)
191 >        {
192 >        case ok:
193 >                if (debug) cerr << "response = " << response << "\n";
194 >                answer = true;
195 >                break;
196 >        case choices:
197 >        case moved:
198 >        case found:
199 >                if (debug) cerr << "response = " << response << "\n"
200 >                        << "location = " << location << "\n";
201 >                location = getLink(location, url);
202 >                break;
203 >        case notfound:
204 >        case internal:
205 >                if (debug) cerr << "response = " << response << "\n";
206 >                break;
207 >        default:
208 >                if (debug) cerr << "response = " << response << "\n";
209 >                if (response <= 299)
210 >                {
211 >                        answer = true;
212 >                }
213 >                else if (response <= 399)
214 >                {
215 >                        location = getLink(location, url);
216 >                }
217 >                break;
218 >        }
219  
220          return answer;
221   }
# Line 146 | Line 262 | bool HttpHandler::good()
262  
263   void HttpHandler::clear()
264   {
265 +        closesocket(http);
266 +
267 +        type = "";
268 +        length = 0;
269 +        location = "";
270          begin = 0;
271          page = "";
272 +        chunked = false;
273 + }
274 +
275 + void HttpHandler::putline(const string line)
276 + {
277 +        sprintf(buffer, "%s\r\n", line.c_str());
278 +        if (send(http, buffer, strlen(buffer), 0) == SOCKET_ERROR)
279 +        {
280 +                error(program + ": Send");
281 +                exit(1);
282 +        }
283 + }
284 +
285 + string HttpHandler::getline()
286 + {
287 +        string line;
288 +        char byte;
289 +
290 +        do
291 +        {
292 +                if (recv(http, &byte, 1, 0) == SOCKET_ERROR)
293 +                {
294 +                        error(program + ": Recv");
295 +                }
296 +
297 +                if (byte != '\r' && byte != '\n')
298 +                {
299 +                        line += byte;
300 +                }
301 +        }
302 +        while (byte != '\n');
303 +
304 +        return line;
305   }
306  
307 < void HttpHandler::error(const string prefix, bool host)
307 > void HttpHandler::error(const string& prefix, bool host)
308   {
309   #ifdef _WIN32
310          string error;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines