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
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:
|
|
|
|
|