parser_8c.tex 7.48 KB
\hypertarget{parser_8c}{
\section{src/http/request/parser.c File Reference}
\label{parser_8c}\index{src/http/request/parser.c@{src/http/request/parser.c}}
}
{\ttfamily \#include $<$string.h$>$}\par
{\ttfamily \#include $<$stdlib.h$>$}\par
{\ttfamily \#include $<$sys/types.h$>$}\par
{\ttfamily \#include \char`\"{}class.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}http/request\_\-parser.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}interface/class.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}interface/stream\_\-reader.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}http/request.h\char`\"{}}\par
{\ttfamily \#include \char`\"{}http/request\_\-queue.h\char`\"{}}\par
Include dependency graph for parser.c:
\subsection*{Functions}
\begin{DoxyCompactItemize}
\item 
void \hyperlink{parser_8c_a659e7ea125685d797a099638b3376320}{httpRequestParserParse} (\hyperlink{structHttpRequestParser}{HttpRequestParser})
\item 
\hyperlink{parser_8c_a0508cf41efb8d26b8c43116711820d71}{INIT\_\-IFACE} (Class, ctor, dtor, \_\-clone)
\item 
\hyperlink{parser_8c_a70f4eea7746a809dd8da71e9cbf4842a}{INIT\_\-IFACE} (StreamReader, get\_\-data)
\item 
\hyperlink{parser_8c_a70093dfed29b221273e59f63936237b5}{CREATE\_\-CLASS} (\hyperlink{structHttpRequestParser}{HttpRequestParser}, NULL, IFACE(Class), IFACE(StreamReader))
\end{DoxyCompactItemize}


\subsection{Function Documentation}
\hypertarget{parser_8c_a70093dfed29b221273e59f63936237b5}{
\index{parser.c@{parser.c}!CREATE\_\-CLASS@{CREATE\_\-CLASS}}
\index{CREATE\_\-CLASS@{CREATE\_\-CLASS}!parser.c@{parser.c}}
\subsubsection[{CREATE\_\-CLASS}]{\setlength{\rightskip}{0pt plus 5cm}CREATE\_\-CLASS (
\begin{DoxyParamCaption}
\item[{{\bf HttpRequestParser}}]{, }
\item[{NULL}]{, }
\item[{IFACE(Class)}]{, }
\item[{IFACE(StreamReader)}]{}
\end{DoxyParamCaption}
)}}
\label{parser_8c_a70093dfed29b221273e59f63936237b5}
\hypertarget{parser_8c_a659e7ea125685d797a099638b3376320}{
\index{parser.c@{parser.c}!httpRequestParserParse@{httpRequestParserParse}}
\index{httpRequestParserParse@{httpRequestParserParse}!parser.c@{parser.c}}
\subsubsection[{httpRequestParserParse}]{\setlength{\rightskip}{0pt plus 5cm}void httpRequestParserParse (
\begin{DoxyParamCaption}
\item[{{\bf HttpRequestParser}}]{}
\end{DoxyParamCaption}
)}}
\label{parser_8c_a659e7ea125685d797a099638b3376320}


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:


\hypertarget{parser_8c_a0508cf41efb8d26b8c43116711820d71}{
\index{parser.c@{parser.c}!INIT\_\-IFACE@{INIT\_\-IFACE}}
\index{INIT\_\-IFACE@{INIT\_\-IFACE}!parser.c@{parser.c}}
\subsubsection[{INIT\_\-IFACE}]{\setlength{\rightskip}{0pt plus 5cm}INIT\_\-IFACE (
\begin{DoxyParamCaption}
\item[{Class}]{, }
\item[{ctor}]{, }
\item[{dtor}]{, }
\item[{\_\-clone}]{}
\end{DoxyParamCaption}
)}}
\label{parser_8c_a0508cf41efb8d26b8c43116711820d71}
\hypertarget{parser_8c_a70f4eea7746a809dd8da71e9cbf4842a}{
\index{parser.c@{parser.c}!INIT\_\-IFACE@{INIT\_\-IFACE}}
\index{INIT\_\-IFACE@{INIT\_\-IFACE}!parser.c@{parser.c}}
\subsubsection[{INIT\_\-IFACE}]{\setlength{\rightskip}{0pt plus 5cm}INIT\_\-IFACE (
\begin{DoxyParamCaption}
\item[{StreamReader}]{, }
\item[{get\_\-data}]{}
\end{DoxyParamCaption}
)}}
\label{parser_8c_a70f4eea7746a809dd8da71e9cbf4842a}