00001 #include <string.h>
00002 #include <stdlib.h>
00003 #include <stdio.h>
00004 #include <ctype.h>
00005
00006 #include "../../include/appConfig.h"
00007 #include "../../include/httpRequest.h"
00008 #include "../../include/client.h"
00009
00010 #define SPACE 0x20
00011
00012
00013 char httpRequest[8][8] = {
00014 "OPTIONS",
00015 "GET",
00016 "HEAD",
00017 "POST",
00018 "PUT",
00019 "DELETE",
00020 "TRACE",
00021 "CONNECT"
00022 };
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 int
00041 httpHeaderGetLine(tHttpHeader * header, char ** buffer, unsigned int * readPos)
00042 {
00043 return 1;
00044 }
00045
00046 void
00047 httpHeaderParseRequestLine(tHttpHeader * header, const char * line, unsigned int len)
00048 {
00049 }
00050
00051 int
00052 httpHeaderIsComplete(tHttpHeader * header)
00053 {
00054 if (NULL == header->req.method) {
00055 return 0;
00056 }
00057
00058 return 1;
00059 }
00060
00061 unsigned char
00062 httpHeaderIsStarted(tHttpHeader * header) {
00063 return 1;
00064 }
00065
00066 static void
00067 httpRequestStrip(char ** buffer, unsigned int * readPos)
00068 {
00069 char * end = *buffer;
00070
00071
00072 while (('\r' == *end || '\n' == *end) && *end) {
00073 end++;
00074 }
00075
00076 if (end != *buffer) {
00077 memmove(*buffer, end, *readPos - (end - *buffer));
00078 memset(*buffer, 0, end - *buffer);
00079
00080 *readPos -= (end - * buffer);
00081 }
00082 }
00083
00084 int
00085 httpHeaderGet(char ** buffer, unsigned int * readPos, tHttpHeader * request)
00086 {
00087 char * end = *buffer;
00088 unsigned int readPosNew;
00089
00090 httpRequestStrip(buffer, readPos);
00091 end = strstr(*buffer, "\r\n\r\n");
00092
00093
00094 if (!httpHeaderIsComplete(request) && NULL != end) {
00095
00096 char * methodEnd = strchr(*buffer, SPACE);
00097 char * uriEnd = strchr(methodEnd + 1, SPACE);
00098 char * lineEnd = strstr(*buffer, "\r\n");
00099
00100 request->req.method =
00101 calloc(methodEnd-*buffer+1, sizeof(char));
00102 request->req.requestUri =
00103 calloc(uriEnd-methodEnd, sizeof(char));
00104 request->req.httpVersion =
00105 calloc(lineEnd-uriEnd, sizeof(char));
00106
00107 sscanf(*buffer, "%s %s %s\r\n",
00108 request->req.method,
00109 request->req.requestUri,
00110 request->req.httpVersion);
00111
00112 readPosNew = (*buffer + *readPos) - lineEnd - 2;
00113 memmove(*buffer, lineEnd + 2, readPosNew);
00114 memset(*buffer + readPosNew, 0, *readPos - readPosNew);
00115 *readPos = readPosNew;
00116
00117
00118 do {
00119 char * keyEnd = strchr(*buffer, ':');
00120
00121 lineEnd = strstr(*buffer, "\r\n");
00122
00123 if (lineEnd != *buffer) {
00124 tHttpHeaderLine * actHeader;
00125 char * actKey = NULL;
00126
00127 request->headersCount += 1;
00128
00129 request->headers = realloc(request->headers,
00130 request->headersCount * sizeof(tHttpHeaderLine));
00131 actHeader = &(request->headers[request->headersCount-1]);
00132 memset(actHeader, 0, sizeof(tHttpHeaderLine));
00133
00134 actKey = actHeader->key = calloc(keyEnd-*buffer+1, sizeof(char));
00135 actHeader->value = calloc(lineEnd-keyEnd-1, sizeof(char));
00136
00137 sscanf(*buffer, "%[^:]:%s\r\n",
00138 actHeader->key, actHeader->value);
00139
00140 for (; NULL != actKey && *actKey != '\0'; actKey++) {
00141 *actKey = tolower(*actKey);
00142 }
00143
00144 if (0 == strncmp("content-length", actHeader->key, strlen(actHeader->key))) {
00145 request->bodyLength = atoi(actHeader->value);
00146 }
00147 }
00148
00149 readPosNew = (*buffer + *readPos) - lineEnd - 2;
00150 memmove(*buffer, lineEnd + 2, readPosNew);
00151 memset(*buffer + readPosNew, 0, *readPos - readPosNew);
00152 *readPos = readPosNew;
00153 } while (lineEnd != *buffer);
00154
00155 return request->bodyLength;
00156 }
00157
00158 return 0;
00159 }
00160
00161 int
00162 getHttpRequest(char ** buffer, unsigned int * readPos, tHttpRequest * request)
00163 {
00164
00165 if (request->header.bodyLength != request->length) {
00166 size_t size = MIN(
00167 request->header.bodyLength - request->length,
00168 *readPos);
00169
00170 if (0 != size) {
00171 if (NULL == request->body) {
00172 request->body = calloc(request->header.bodyLength, sizeof(char));
00173 }
00174
00175 memcpy(request->body + request->length, *buffer, size);
00176 memmove(*buffer, *buffer + size, *readPos - size);
00177 memset(*buffer + (*readPos - size), 0, size);
00178 *readPos -= size;
00179 request->length += size;
00180 }
00181 }
00182
00183 return 0;
00184 }
00185
00186 void
00187 freeHttpHeader(tHttpHeader * header) {
00188 unsigned int i;
00189
00190 if (NULL != header->req.method) {
00191 free(header->req.method);
00192 }
00193 if (NULL != header->req.requestUri) {
00194 free(header->req.requestUri);
00195 }
00196 if (NULL != header->req.httpVersion) {
00197 free(header->req.httpVersion);
00198 }
00199
00200 for (i=0; i<header->headersCount; i++) {
00201 if (NULL != header->headers[i].key) {
00202 free(header->headers[i].key);
00203 }
00204 if (NULL != header->headers[i].value) {
00205 free(header->headers[i].value);
00206 }
00207 }
00208
00209 if (NULL != header->headers) {
00210 free(header->headers);
00211 }
00212
00213 memset (header, 0, sizeof (tHttpHeader));
00214 }
00215
00216 void
00217 freeHttpRequest(tHttpRequest * request) {
00218 unsigned int i;
00219
00220 if (NULL != request->header.req.method) {
00221 free(request->header.req.method);
00222 request->header.req.method = NULL;
00223 }
00224 if (NULL != request->header.req.requestUri) {
00225 free(request->header.req.requestUri);
00226 request->header.req.requestUri = NULL;
00227 }
00228 if (NULL != request->header.req.httpVersion) {
00229 free(request->header.req.httpVersion);
00230 request->header.req.httpVersion = NULL;
00231 }
00232
00233 for (i=0; i<request->header.headersCount; i++) {
00234 if (NULL != request->header.headers[i].key) {
00235 free(request->header.headers[i].key);
00236 request->header.headers[i].key = NULL;
00237 }
00238 if (NULL != request->header.headers[i].value) {
00239 free(request->header.headers[i].value);
00240 request->header.headers[i].value = NULL;
00241 }
00242 }
00243
00244 if (NULL != request->header.headers) {
00245 free(request->header.headers);
00246 request->header.headers = NULL;
00247 }
00248
00249 if (NULL != request->body) {
00250 free(request->body);
00251 request->body = NULL;
00252 }
00253
00254 memset (request, 0, sizeof (tHttpRequest));
00255 }