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 17 by douglas, 2002-12-09T18:31:11-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
# Line 66 | Line 67 | HttpHandler::HttpHandler()
67  
68   HttpHandler::~HttpHandler()
69   {
70 +        delete [] buffer;
71 +
72   #ifdef _WIN32
73          WSACleanup();
74   #endif // _WIN32
75   }
76  
77 < bool HttpHandler::connect(URL &url, bool head)
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 >        string line = getline();
137 >
138 >        if (line.find("HTTP/") != 0)
139 >        {
140 >                return answer;
141 >        }
142 >
143 >        unsigned dot = line.find('.');
144 >        unsigned space = line.find(' ');
145 >
146 >        unsigned major = strtoul(line.substr(5, dot - 5).c_str(), 0, 0);
147 >        unsigned minor = strtoul(line.substr(dot + 1, space - dot - 1).c_str(), 0,
148 >                0);
149 >
150 >        if (major > 1 || minor < 1)
151 >        {
152 >                cerr << program << ": Potentially Incompatible Server: HTTP/" << major
153 >                        << "." << minor << "\n";
154 >
155 >                return answer;
156 >        }
157 >
158 >        code response = code(strtoul(line.substr(space + 1).c_str(), 0, 0));
159 >
160 >        do
161 >        {
162 >                line = getline();
163 >        }
164 >        while (line != "");
165 >
166 >        switch (response)
167 >        {
168 >        case ok:
169 >                answer = true;
170 >                break;
171 >        case choices:
172 >                break;
173 >        case moved:
174 >                break;
175 >        case found:
176 >                break;
177 >        case notfound:
178 >                break;
179 >        case internal:
180 >                break;
181 >        default:
182 >                break;
183 >        }
184  
185          return answer;
186   }
# Line 146 | Line 227 | bool HttpHandler::good()
227  
228   void HttpHandler::clear()
229   {
230 +        type = "";
231 +        length = 0;
232 +        location = "";
233          begin = 0;
234          page = "";
235   }
236  
237 + void HttpHandler::putline(const string line)
238 + {
239 +        sprintf(buffer, "%s\r\n", line.c_str());
240 +        if (send(http, buffer, strlen(buffer), 0) == SOCKET_ERROR)
241 +        {
242 +                error(program + ": Send");
243 +                exit(1);
244 +        }
245 + }
246 +
247 + string HttpHandler::getline()
248 + {
249 +        string line;
250 +        char byte;
251 +
252 +        do
253 +        {
254 +                if (recv(http, &byte, 1, 0) == SOCKET_ERROR)
255 +                {
256 +                        error(program + ": Recv");
257 +                }
258 +
259 +                if (byte != '\r' && byte != '\n')
260 +                {
261 +                        line += byte;
262 +                }
263 +        }
264 +        while (byte != '\n');
265 +
266 +        return line;
267 + }
268 +
269   void HttpHandler::error(const string prefix, bool host)
270   {
271   #ifdef _WIN32

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines