Another abandoned server code base... this is kind of an ancestor of taskrambler.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

222 lines
7.7 KiB

\hypertarget{parse_8c}{
\section{src/http/request/parser/parse.c File Reference}
\label{parse_8c}\index{src/http/request/parser/parse.c@{src/http/request/parser/parse.c}}
}
{\ttfamily \#include $<$stdlib.h$>$}\par
{\ttfamily \#include $<$string.h$>$}\par
{\ttfamily \#include $<$unistd.h$>$}\par
{\ttfamily \#include $<$ctype.h$>$}\par
{\ttfamily \#include \char`\"{}http/request\_\-parser.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}interface/class.h\char`\"{}}\par
Include dependency graph for parse.c:
\subsection*{Defines}
\begin{DoxyCompactItemize}
\item
\#define \hyperlink{parse_8c_a3d501f4eabec1eb9a20aed0a116b69a3}{REMAINS}(pars, done)~((pars)-\/$>$buffer\_\-used -\/ ((done) -\/ (pars)-\/$>$buffer))
\end{DoxyCompactItemize}
\subsection*{Functions}
\begin{DoxyCompactItemize}
\item
void \hyperlink{parse_8c_a187bf52da83090068bafea54589f6f69}{httpRequestParserGetRequestLine} (\hyperlink{structHttpRequest}{HttpRequest}, char $\ast$)
\item
void \hyperlink{parse_8c_a9bb74bc564fe961a7ab5459ef5806de6}{httpRequestParserParse} (\hyperlink{structHttpRequestParser}{HttpRequestParser} this)
\end{DoxyCompactItemize}
\subsection{Define Documentation}
\hypertarget{parse_8c_a3d501f4eabec1eb9a20aed0a116b69a3}{
\index{parse.c@{parse.c}!REMAINS@{REMAINS}}
\index{REMAINS@{REMAINS}!parse.c@{parse.c}}
\subsubsection[{REMAINS}]{\setlength{\rightskip}{0pt plus 5cm}\#define REMAINS(
\begin{DoxyParamCaption}
\item[{}]{pars, }
\item[{}]{done}
\end{DoxyParamCaption}
)~((pars)-\/$>$buffer\_\-used -\/ ((done) -\/ (pars)-\/$>$buffer))}}
\label{parse_8c_a3d501f4eabec1eb9a20aed0a116b69a3}
Definition at line 10 of file parse.c.
\subsection{Function Documentation}
\hypertarget{parse_8c_a187bf52da83090068bafea54589f6f69}{
\index{parse.c@{parse.c}!httpRequestParserGetRequestLine@{httpRequestParserGetRequestLine}}
\index{httpRequestParserGetRequestLine@{httpRequestParserGetRequestLine}!parse.c@{parse.c}}
\subsubsection[{httpRequestParserGetRequestLine}]{\setlength{\rightskip}{0pt plus 5cm}void httpRequestParserGetRequestLine (
\begin{DoxyParamCaption}
\item[{{\bf HttpRequest}}]{, }
\item[{char $\ast$}]{}
\end{DoxyParamCaption}
)}}
\label{parse_8c_a187bf52da83090068bafea54589f6f69}
Definition at line 7 of file get\_\-request\_\-line.c.
\begin{DoxyCode}
{
char * method, * uri, * version;
method = line;
uri = strchr(line, ' ');
*uri++ = 0;
for (; *uri == ' ' && *uri != 0; uri++);
version = strchr(uri, ' ');
*version++ = 0;
for (; *version == ' ' && *version != 0; version++);
request->method = malloc(strlen(method) + 1);
strcpy(request->method, method);
request->uri = malloc(strlen(uri) + 1);
strcpy(request->uri, uri);
request->version = malloc(strlen(version) + 1);
strcpy(request->version, method);
}
\end{DoxyCode}
Here is the caller graph for this function:
\hypertarget{parse_8c_a9bb74bc564fe961a7ab5459ef5806de6}{
\index{parse.c@{parse.c}!httpRequestParserParse@{httpRequestParserParse}}
\index{httpRequestParserParse@{httpRequestParserParse}!parse.c@{parse.c}}
\subsubsection[{httpRequestParserParse}]{\setlength{\rightskip}{0pt plus 5cm}void httpRequestParserParse (
\begin{DoxyParamCaption}
\item[{{\bf HttpRequestParser}}]{this}
\end{DoxyParamCaption}
)}}
\label{parse_8c_a9bb74bc564fe961a7ab5459ef5806de6}
enqueue current request
remove processed stuff from input buffer.
dont continue loop if input buffer is empty
prepare for next request
Definition at line 43 of file parse.c.
\begin{DoxyCode}
{
static HttpRequest request = NULL;
static char * data; // static pointer to unprocessed data
char * line;
int cont = 1;
while(cont) {
switch(this->state) {
case HTTP_REQUEST_GARBAGE:
data = this->buffer; // initialize static pointer
httpRequestSkip(&data);
request = new(HttpRequest);
this->state = HTTP_REQUEST_START;
break;
case HTTP_REQUEST_START:
if (NULL == (line = httpRequestParserGetLine(&dat
a))) {
cont = 0;
break;
}
httpRequestParserGetRequestLine(request, line);
this->state = HTTP_REQUEST_REQUEST_LINE_DONE;
break;
case HTTP_REQUEST_REQUEST_LINE_DONE:
if (NULL == (line = httpRequestParserGetLine(&dat
a))) {
cont = 0;
break;
}
if (0 == strlen(line)) {
this->state = HTTP_REQUEST_HEADERS_DONE;
break;
}
httpRequestParserGetHeader(request, line);
break;
case HTTP_REQUEST_HEADERS_DONE:
httpHeaderSort(request->header, request->nheader)
;
{
char * nbody;
if (0 == request->nbody) {
nbody = httpHeaderGet(
request->header,
request->nheader,
"Content-Length")
;
if (NULL == nbody) {
this->state =
HTTP_REQUEST_DONE;
break;
}
else {
request->nbody = atoi(nbo
dy);
}
}
if (REMAINS(this, data) >= request->
nbody) {
request->body = calloc(1, request
->nbody + 1);
memcpy(request->body, data, reque
st->nbody);
data += request->nbody;
this->state = HTTP_REQUEST_DONE;
}
}
break;
case HTTP_REQUEST_DONE:
this->request_queue->requests[(this->request_queu
e->nrequests)++] =
request;
memmove(this->buffer, data, REMAINS(this, data));
this->buffer_used -= data - this->buffer;
if (0 == this->buffer_used) {
cont = 0;
}
this->state = HTTP_REQUEST_GARBAGE;
break;
default:
break;
}
}
}
\end{DoxyCode}
Here is the call graph for this function: