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 1 by douglas, 2002-12-04T20:22:59-08:00 vs.
Revision 14 by douglas, 2002-12-07T00:19:03-08:00

# Line 50 | Line 50
50  
51   #include "HttpHandler.h"
52  
53 #ifdef _WIN32
54 #define PATH_SEPARATOR "\\"
55 #define ENV_SEPARATOR ';'
56 #else
57 #define PATH_SEPARATOR "/"
58 #define ENV_SEPARATOR ':'
59 #endif
60
53   HttpHandler::HttpHandler()
54   {
55 <        string arguments = "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/Strin"
64 <                + string("g;Ljava/lang/String;)Ljava/lang/String;");
55 >        buffer = new char[BUFSIZ + 1];
56  
57 <        begin = 0;
58 <
59 <        setJarPath();
57 > #ifdef _WIN32
58 >        if (WSAStartup(MAKEWORD(2, 0), &data) != 0)
59 >        {
60 >                error(program + ": WSAStartup()");
61 >                exit(1);
62 >        }
63 > #endif // _WIN32
64  
65 < //      options[0].optionString = jarPath;
71 < //      memset(&vm_args, 0, sizeof (vm_args));
72 < //      vm_args.version = JNI_VERSION_1_4;
73 < //      vm_args.nOptions = 1;
74 < //      vm_args.options = options;
75 <
76 < //      status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
77 <
78 < //      if (status != JNI_ERR)
79 < //      {
80 < //              cls = env->FindClass("HttpConnector");
81 <
82 < //              if (cls != 0)
83 < //              {
84 < //                      mid = env->GetStaticMethodID(cls, "connect", arguments.c_str());
85 < //              }
86 < //      }
65 >        begin = 0;
66   }
67  
68   HttpHandler::~HttpHandler()
69   {
70 < //      if (status != JNI_ERR)
92 < //      {
93 < //              jvm->DestroyJavaVM();
94 < //      }
70 >        delete [] buffer;
71  
72 < //      delete [] jarPath;
72 > #ifdef _WIN32
73 >        WSACleanup();
74 > #endif // _WIN32
75   }
76  
77 < bool HttpHandler::connect(URL& url)
77 > bool HttpHandler::handle(URL &url, bool head)
78   {
79          bool answer = false;
80  
81 < //      if (status != JNI_ERR)
82 < //      {
83 < //              if (cls != 0)
84 < //              {
85 < //                      if (mid != 0)
86 < //                      {
87 < //                              jstring addressJ = env->NewStringUTF(url.getAddress().c_str());
88 < //                              jint portJ = url.getPort();
89 < //                              jstring pathJ = env->NewStringUTF(url.getPath().c_str());
90 < //                              jstring programNameJ = env->NewStringUTF(programName.c_str());
91 < //                              jstring programVersionJ =
92 < //                                      env->NewStringUTF(programVersion.c_str());
93 <
94 < //                              jstring pageJ = (jstring)env->CallStaticObjectMethod(cls, mid,
95 < //                                      addressJ, portJ, pathJ, programNameJ, programVersionJ);
96 <
97 < //                              const char* pageC = env->GetStringUTFChars(pageJ, 0);
98 < //                              page = pageC;
99 < //                              env->ReleaseStringUTFChars(pageJ, pageC);
100 <
101 < //                              if (page != "unknown host\n" && page != "io exception\n" &&
102 < //                                      page != "bad headers\n") answer = true;
103 < //                      }
104 < //              }
105 < //      }
81 >        if ((http = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
82 >        {
83 >                error(program + ": Socket");
84 >                exit(1);
85 >        }
86 >
87 >        sockaddr_in address;
88 >        hostent* host;
89 >
90 >        address.sin_family = AF_INET;
91 >
92 >        if ((host = gethostbyname(url.getAddress().c_str())) == NULL)
93 >        {
94 >                error(program + ": Host: " + url.getAddress(), true);
95 >                return answer;
96 >        }
97 >
98 >        address.sin_addr = *((in_addr*)*host->h_addr_list);
99 >        address.sin_port = htons(url.getPort());
100 >
101 >        if (connect(http, (sockaddr*)&address, sizeof(sockaddr_in)) ==
102 >                SOCKET_ERROR)
103 >        {
104 >                error(program + ": Connect");
105 >                return answer;
106 >        }
107 >
108 >        if (head)
109 >        {
110 >                putline("HEAD " + url.getPath() + " HTTP/1.1");
111 >        }
112 >        else
113 >        {
114 >                putline("GET " + url.getPath() + " HTTP/1.1");
115 >        }
116 >
117 >        putline("Accept: text/html; text/plain");
118 >        putline("User-Agent: " + agent(true) + ' ' + platform());
119 >
120 >        if (url.getPort() == 80)
121 >        {
122 >                putline("Host: " + url.getAddress());
123 >        }
124 >        else
125 >        {
126 >                char* port = new char[1024];
127 >                sprintf(port, "%u", url.getPort());
128 >
129 >                putline("Host: " + url.getAddress() + ':' + port);
130 >
131 >                delete [] port;
132 >        }
133 >
134 >        putline();
135  
136          return answer;
137   }
# Line 175 | Line 182 | void HttpHandler::clear()
182          page = "";
183   }
184  
185 < void HttpHandler::setJarPath()
185 > void HttpHandler::putline(const string line)
186   {
187 <        const string jarFile = "HttpConnector.jar";
188 <        string jarFilePath = jarFile;
187 >        sprintf(buffer, "%s\r\n", line.c_str());
188 >        if (send(http, buffer, strlen(buffer), 0) == SOCKET_ERROR)
189 >        {
190 >                error(program + ": Send");
191 >                exit(1);
192 >        }
193 > }
194 >
195 > void HttpHandler::error(const string prefix, bool host)
196 > {
197 > #ifdef _WIN32
198 >        string error;
199  
200 <        ifstream fin(jarFilePath.c_str());
184 <        if (!fin.is_open())
200 >        switch (WSAGetLastError())
201          {
202 <                unsigned end = program.rfind(PATH_SEPARATOR);
203 <                if (end != string::npos)
204 <                {
205 <                        string path = program.substr(0, end);
206 <
207 <                        jarFilePath = path + PATH_SEPARATOR + jarFile;
208 <
209 <                        fin.open(jarFilePath.c_str());
210 <                        if (!fin.is_open())
211 <                        {
212 <                                cerr << program << ": Could not find required file: "
213 <                                        << jarFile << "\n";
214 <                                exit(1);
215 <                        }
216 <                        else
217 <                        {
218 <                                fin.close();
219 <                        }
220 <                }
221 <                else
222 <                {
223 <                        string envPath = getenv("PATH");
224 <
225 <                        if (debug) cerr << "envPath = " << envPath << "\n";
226 <
227 <                        unsigned begin = 0;
228 <                        do
229 <                        {
230 <                                unsigned end = envPath.find(ENV_SEPARATOR, begin);
231 <                                string path = envPath.substr(begin, end);
232 <
233 <                                if (debug) cerr << "path = " << path << "\n";
234 <
235 <                                jarFilePath = path + PATH_SEPARATOR + jarFile;
236 <
237 <                                fin.open(jarFilePath.c_str());
238 <                                if (fin.is_open())
239 <                                {
240 <                                        fin.close();
241 <                                        break;
242 <                                }
243 <
244 <                                begin = end != string::npos ? end + 1 : string::npos;
245 <                        }
246 <                        while (begin < envPath.length());
247 <
248 <                        if (begin == string::npos)
249 <                        {
250 <                                cerr << program << ": Could not find required file: "
251 <                                        << jarFile << "\n";
252 <                                exit(1);
253 <                        }
254 <                }
202 >        case WSAEACCES:
203 >                error = "Permission denied.";
204 >                break;
205 >        case WSAEADDRINUSE:
206 >                error = "Address already in use.";
207 >                break;
208 >        case WSAEADDRNOTAVAIL:
209 >                error = "Cannot assign requested address.";
210 >                break;
211 >        case WSAEAFNOSUPPORT:
212 >                error = "Address family not supported by protocol family.";
213 >                break;
214 >        case WSAEALREADY:
215 >                error = "Operation already in progress.";
216 >                break;
217 >        case WSAECONNABORTED:
218 >                error = "Software caused connection abort.";
219 >                break;
220 >        case WSAECONNREFUSED:
221 >                error = "Connection refused.";
222 >                break;
223 >        case WSAECONNRESET:
224 >                error = "Connection reset by peer.";
225 >                break;
226 >        case WSAEDESTADDRREQ:
227 >                error = "Destination address required.";
228 >                break;
229 >        case WSAEFAULT:
230 >                error = "Bad address.";
231 >                break;
232 >        case WSAEHOSTDOWN:
233 >                error = "Host is down.";
234 >                break;
235 >        case WSAEHOSTUNREACH:
236 >                error = "No route to host.";
237 >                break;
238 >        case WSAEINPROGRESS:
239 >                error = "Operation now in progress.";
240 >                break;
241 >        case WSAEINTR:
242 >                error = "Interrupted function call.";
243 >                break;
244 >        case WSAEINVAL:
245 >                error = "Invalid argument.";
246 >                break;
247 >        case WSAEISCONN:
248 >                error = "Socket is already connected.";
249 >                break;
250 >        case WSAEMFILE:
251 >                error = "Too many open files.";
252 >                break;
253 >        case WSAEMSGSIZE:
254 >                error = "Message too long.";
255 >                break;
256 >        case WSAENETDOWN:
257 >                error = "Network is down.";
258 >                break;
259 >        case WSAENETRESET:
260 >                error = "Network dropped connection on reset.";
261 >                break;
262 >        case WSAENETUNREACH:
263 >                error = "Network is unreachable.";
264 >                break;
265 >        case WSAENOBUFS:
266 >                error = "No buffer space available.";
267 >                break;
268 >        case WSAENOPROTOOPT:
269 >                error = "Bad protocol option.";
270 >                break;
271 >        case WSAENOTCONN:
272 >                error = "Socket is not connected.";
273 >                break;
274 >        case WSAENOTSOCK:
275 >                error = "Socket operation on non-socket.";
276 >                break;
277 >        case WSAEOPNOTSUPP:
278 >                error = "Operation not supported.";
279 >                break;
280 >        case WSAEPFNOSUPPORT:
281 >                error = "Protocol family not supported.";
282 >                break;
283 >        case WSAEPROCLIM:
284 >                error = "Too many processes.";
285 >                break;
286 >        case WSAEPROTONOSUPPORT:
287 >                error = "Protocol not supported.";
288 >                break;
289 >        case WSAEPROTOTYPE:
290 >                error = "Protocol wrong type for socket.";
291 >                break;
292 >        case WSAESHUTDOWN:
293 >                error = "Cannot send after socket shutdown.";
294 >                break;
295 >        case WSAESOCKTNOSUPPORT:
296 >                error = "Socket type not supported.";
297 >                break;
298 >        case WSAETIMEDOUT:
299 >                error = "Connection timed out.";
300 >                break;
301 >        case WSATYPE_NOT_FOUND:
302 >                error = "Class type not found.";
303 >                break;
304 >        case WSAEWOULDBLOCK:
305 >                error = "Resource temporarily unavailable.";
306 >                break;
307 >        case WSAHOST_NOT_FOUND:
308 >                error = "Host not found.";
309 >                break;
310 >        case WSA_INVALID_HANDLE:
311 >                error = "Specified event object handle is invalid.";
312 >                break;
313 >        case WSA_INVALID_PARAMETER:
314 >                error = "One or more parameters are invalid.";
315 >                break;
316 > //      case WSAINVALIDPROCTABLE:
317 > //              error = "Invalid procedure table from service provider.";
318 > //              break;
319 > //      case WSAINVALIDPROVIDER:
320 > //              error = "Invalid service provider version number.";
321 > //              break;
322 >        case WSA_IO_INCOMPLETE:
323 >                error = "Overlapped I/O event object not in signaled state.";
324 >                break;
325 >        case WSA_IO_PENDING:
326 >                error = "Overlapped operations will complete later.";
327 >                break;
328 >        case WSA_NOT_ENOUGH_MEMORY:
329 >                error = "Insufficient memory available.";
330 >                break;
331 >        case WSANOTINITIALISED:
332 >                error = "Successful WSAStartup not yet performed.";
333 >                break;
334 >        case WSANO_DATA:
335 >                error = "Valid name, no data record of requested type.";
336 >                break;
337 >        case WSANO_RECOVERY:
338 >                error = "This is a non-recoverable error.";
339 >                break;
340 > //      case WSAPROVIDERFAILEDINIT:
341 > //              error = "Unable to initialize a service provider.";
342 > //              break;
343 >        case WSASYSCALLFAILURE:
344 >                error = "System call failure.";
345 >                break;
346 >        case WSASYSNOTREADY:
347 >                error = "Network subsystem is unavailable.";
348 >                break;
349 >        case WSATRY_AGAIN:
350 >                error = "Non-authoritative host not found.";
351 >                break;
352 >        case WSAVERNOTSUPPORTED:
353 >                error = "WINSOCK.DLL version out of range.";
354 >                break;
355 >        case WSAEDISCON:
356 >                error = "Graceful shutdown in progress.";
357 >                break;
358 >        case WSA_OPERATION_ABORTED:
359 >                error = "Overlapped operation aborted.";
360 >                break;
361 >        default:
362 >                error = "Unknown error.";
363 >                break;
364 >        }
365 >
366 >        cerr << prefix << ": " << error << "\n";
367 > #else
368 >        if (host)
369 >        {
370 >                herror(prefix.c_str());
371          }
372          else
373          {
374 <                fin.close();
374 >                perror(prefix.c_str());
375          }
376 <
245 <        string jarPath = "-Djava.class.path=" + jarFilePath;
246 <
247 < //      this->jarPath = new char[jarPath.length()];
248 < //      strcpy(this->jarPath, jarPath.c_str());
376 > #endif // _WIN32
377   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines