6 #include <Raym/Log.h>
\r
7 #include "net/HTTPRequest.h"
\r
9 using namespace Raym;
\r
14 const char *HTTPRequest::KEY_CGI = "CGI";
\r
15 const char *HTTPRequest::KEY_PARAMS = "PARAMS";
\r
17 HTTPRequest::HTTPRequest()
\r
25 HTTPRequest::~HTTPRequest()
\r
33 HTTPRequest *HTTPRequest::requestWithSocket(SOCKET sock)
\r
35 DebugLog2("%s", __FUNCTION__);
\r
39 while (offset < sizeof(buf) - 1)
\r
41 int len = recv(sock, &buf[offset], 1, 0);
\r
48 if ((buf[offset - 1] == '\r') && (buf[offset] == '\n'))
\r
58 DebugLog2("%s 02", __FUNCTION__);
\r
60 HTTPRequest *result = NULL;
\r
62 String *method = NULL;
\r
64 String *version = NULL;
\r
65 if (strchr(buf, ' ') != NULL)
\r
67 char *p = strchr(buf, ' ');
\r
69 if ((buf[strlen(buf) - 2] == '\r') && (buf[strlen(buf) - 1] == '\n'))
\r
71 buf[strlen(buf) - 2] = '\0';
\r
73 method = String::alloc()->initWithUTF8String(&buf[0]);
\r
78 if (strchr(p, ' ') != NULL)
\r
80 char *p2 = strchr(p, ' ');
\r
82 if ((p[strlen(p) - 2] == '\r') && (p[strlen(p) - 1] == '\n'))
\r
84 p[strlen(p) - 2] = '\0';
\r
86 uri = String::alloc()->initWithUTF8String(p);
\r
91 if (strchr(p2, ' ') == NULL)
\r
93 if ((p2[strlen(p2) - 2] == '\r') && (p2[strlen(p2) - 1] == '\n'))
\r
95 p2[strlen(p2) - 2] = '\0';
\r
97 version = String::alloc()->initWithUTF8String(p2);
\r
102 if (version != NULL)
\r
104 if (version->isEqualToString(String::stringWithUTF8String("HTTP/1.0")) || version->isEqualToString(String::stringWithUTF8String("HTTP/1.1")))
\r
106 InternetTextMessageHeader *header = InternetTextMessageHeader::alloc()->initWithSocket(sock);
\r
107 if (header != NULL)
\r
109 InternetTextMessageBody *body = NULL;
\r
111 if (header->fieldBodyForName("Transfer-Encoding") != NULL)
\r
113 DebugLog3("has Transfer-Encoding\n");
\r
116 else if (header->fieldBodyForName("Content-Length") != NULL)
\r
118 DebugLog3("has Content-Length\n");
\r
121 else if (header->fieldBodyForName("Content-Type") != NULL)
\r
123 DebugLog3("has Content-Type\n");
\r
128 InternetTextMessage *message = InternetTextMessage::alloc()->initWithHeaderAndBody(header, body);
\r
132 result = new HTTPRequest();
\r
133 result->setMethod(method);
\r
134 result->setURI(uri);
\r
135 result->setVersion(version);
\r
136 result->setMessage(message);
\r
137 result->autorelease();
\r
143 DebugLog3("error: InternetTextMessageHeader::headerWithSocket()\n");
\r
155 void HTTPRequest::setMethod(String *method)
\r
157 SET_METHOD(_method, method);
\r
160 String *HTTPRequest::method()
\r
165 void HTTPRequest::setURI(String *uri)
\r
167 SET_METHOD(_uri, uri);
\r
170 String *HTTPRequest::URI()
\r
175 void HTTPRequest::setVersion(String *version)
\r
177 SET_METHOD(_version, version);
\r
180 String *HTTPRequest::version()
\r
185 void HTTPRequest::setMessage(InternetTextMessage *message)
\r
187 SET_METHOD(_message, message);
\r
190 InternetTextMessage *HTTPRequest::message()
\r
195 Dictionary *HTTPRequest::parseAsCGI()
\r
197 DebugLog2("HTTPRequest::parseAsCGI()");
\r
199 Dictionary *result = NULL;
\r
202 DebugLog3("_uri != NULL");
\r
203 char *tmpstr = _strdup(_uri->cString());
\r
204 if (tmpstr != NULL)
\r
206 DebugLog3("tmpstr != NULL");
\r
207 char *p1 = strchr(tmpstr, '?');
\r
210 DebugLog3("p1 != NULL");
\r
212 DebugLog2("cgi: %s", tmpstr);
\r
213 result = Dictionary::dictionaryWithCapacity(0);
\r
214 result->setObject(String::stringWithUTF8String(tmpstr), KEY_CGI);
\r
216 Array *params = Array::arrayWithCapacity(0);
\r
217 result->setObject(params, KEY_PARAMS);
\r
222 char *p2 = strchr(p1, '&');
\r
227 char *p3 = strchr(p1, '=');
\r
231 String *para_name = String::stringWithUTF8String(p1);
\r
233 String *para_val = String::stringWithUTF8String(p3);
\r
234 DebugLog3("para_name: %s, para_val: %s", p1, p3);
\r
235 Dictionary *para = Dictionary::dictionaryWithCapacity(0);
\r
236 para->setObject(para_val, para_name);
\r
237 params->addObject(para);
\r
257 const char *HTTPRequest::className()
\r
259 return "HTTPRequest";
\r