/* * Get the next input token. The content buffer is advanced to the next token. This routine always returns a * non-zero token. The empty string means the delimiter was not found. */ static char *getToken(MaConn *conn, cchar *delim) { MprBuf *buf; char *token, *nextToken; int len; mprAssert(mprGetParent(conn->input) == conn); buf = conn->input->content; len = mprGetBufLength(buf); if (len == 0) { return ""; } token = mprGetBufStart(buf); nextToken = mprStrnstr(mprGetBufStart(buf), delim, len); if (nextToken) { *nextToken = '\0'; len = (int) strlen(delim); nextToken += len; buf->start = nextToken; } else { buf->start = mprGetBufEnd(buf); mprAddNullToBuf(buf); } return token; }
/* * Parse a new request. Return true to keep going with this or subsequent request, zero means insufficient data to proceed. */ static bool parseRequest(MaConn *conn, MaPacket *packet) { MaRequest *req; char *start, *end; int len; /* * Must wait until we have the complete set of headers. */ if ((len = mprGetBufLength(packet->content)) == 0) { return 0; } start = mprGetBufStart(packet->content); if ((end = mprStrnstr(start, "\r\n\r\n", len)) == 0) { return 0; } len = (int) (end - start); if (len >= conn->host->limits->maxHeader) { maFailConnection(conn, MPR_HTTP_CODE_REQUEST_TOO_LARGE, "Header too big"); return 0; } if (parseFirstLine(conn, packet)) { parseHeaders(conn, packet); } else { return 0; } maMatchHandler(conn); /* * Have read the headers. Create the request pipeline. This calls the open() stage entry routines. */ maCreatePipeline(conn); req = conn->request; if (conn->connectionFailed) { /* Discard input data */ mprAssert(conn->keepAliveCount <= 0); conn->state = MPR_HTTP_STATE_PROCESSING; maRunPipeline(conn); } else if (req->remainingContent > 0) { conn->state = MPR_HTTP_STATE_CONTENT; } else if (req->length == -1 && (req->method == MA_REQ_POST || req->method == MA_REQ_PUT)) { conn->state = MPR_HTTP_STATE_CONTENT; } else { /* * Can run the request now if there is no incoming data. */ conn->state = MPR_HTTP_STATE_PROCESSING; maRunPipeline(conn); } return !conn->disconnected; }
/* Get the next input token. The content buffer is advanced to the next token. This routine always returns a non-zero token. The empty string means the delimiter was not found. */ static char *getCgiToken(MprBuf *buf, cchar *delim) { char *token, *nextToken; int len; len = mprGetBufLength(buf); if (len == 0) { return ""; } token = mprGetBufStart(buf); nextToken = mprStrnstr(mprGetBufStart(buf), delim, len); if (nextToken) { *nextToken = '\0'; len = (int) strlen(delim); nextToken += len; buf->start = nextToken; } else { buf->start = mprGetBufEnd(buf); } return token; }