aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWolfgang Draxinger <Wolfgang.Draxinger@physik.uni-muenchen.de>2013-06-25 16:06:55 +0200
committerWolfgang Draxinger <Wolfgang.Draxinger@physik.uni-muenchen.de>2013-06-25 16:06:55 +0200
commit1fb50bb9c2c971691a93a844a1c3e6b84cdcca31 (patch)
tree55d5bb4ae123e9a4b9a6b7fed66d8972d2c5fca8
parent2c6b42c55b3db99c664de543f32f2434948c5916 (diff)
downloadlitheweb-1fb50bb9c2c971691a93a844a1c3e6b84cdcca31.tar.gz
litheweb-1fb50bb9c2c971691a93a844a1c3e6b84cdcca31.tar.bz2
still superfluous <CR><LF><CR> at end of multipart block
-rw-r--r--picohttp.c75
-rw-r--r--picohttp.h6
2 files changed, 44 insertions, 37 deletions
diff --git a/picohttp.c b/picohttp.c
index 7579d37..3f64857 100644
--- a/picohttp.c
+++ b/picohttp.c
@@ -235,9 +235,9 @@ int16_t picohttpGetch(struct picohttpRequest * const req)
/* use dirty hack?
* *((uint32_t*)prev_ch) = *((uint32_t*)prev_ch) >> 8;
*/
- req->query.prev_ch[0] = req->query.prev_ch[1];
- req->query.prev_ch[1] = req->query.prev_ch[2];
- req->query.prev_ch[2] = ch;
+ req->query.prev_ch[0] = ch;
+ for(int i = 1; i < 4; i++)
+ req->query.prev_ch[i+1] = req->query.prev_ch[i];
}
return ch;
@@ -564,8 +564,8 @@ static void picohttpProcessContentType(
/* see RFC1521 regarding maximum length of boundary */
memset(req->query.multipartboundary, 0,
PICOHTTP_MULTIPARTBOUNDARY_MAX_LEN+1);
- memcpy(req->query.multipartboundary, "\r\n--", 4);
- strncpy(req->query.multipartboundary+4,
+ memcpy(req->query.multipartboundary, "\r\n\r\n--", 6);
+ strncpy(req->query.multipartboundary+6,
boundary + sizeof(PICOHTTP_STR_BOUNDARY)-1,
PICOHTTP_MULTIPARTBOUNDARY_MAX_LEN);
}
@@ -791,8 +791,10 @@ void picohttpProcessRequest (
}
request.query.prev_ch[0] = 0;
- request.query.prev_ch[1] = '\r';
- request.query.prev_ch[2] = '\n';
+ request.query.prev_ch[1] = '\n';
+ request.query.prev_ch[2] = '\r';
+ request.query.prev_ch[3] = '\n';
+ request.query.prev_ch[4] = '\r';
request.status = PICOHTTP_STATUS_200_OK;
request.route->handler(&request);
@@ -933,7 +935,7 @@ int16_t picohttpMultipartGetch(
mp->replayhead++;
debug_printf("replay_n: ");
} else {
- ch = mp->req->query.prev_ch[2];
+ ch = mp->req->query.prev_ch[4];
mp->replay = 0;
mp->replayhead = 0;
mp->in_boundary = 0;
@@ -945,39 +947,44 @@ int16_t picohttpMultipartGetch(
} else {
ch = picohttpGetch(mp->req);
+ /* picohttp's query and header parsing is forgiving
+ * regarding line termination. <CR><LF> or just <LF>
+ * are accepted.
+ * However multipart boundaries are to start with
+ * a <CR><LF><CR><LF> sequence, we're strict about that.
+ */
+
mp->replay = 0;
if( '\r' == ch ) {
- mp->in_boundary = 0;
- mp->replayhead = 0;
+ if( '\r' == mp->req->query.prev_ch[2] &&
+ '\n' == mp->req->query.prev_ch[1] ) {
+ mp->replayhead =
+ mp->in_boundary = 2;
+ } else {
+ mp->replayhead =
+ mp->in_boundary = 0;
+ }
} else
- if( '\r' == mp->req->query.prev_ch[1] &&
- '\n' == ch ) {
- mp->in_boundary = 1;
- mp->replayhead = 1;
+ if( '\n' == ch &&
+ '\r' == mp->req->query.prev_ch[1] ) {
+ if( '\r' == mp->req->query.prev_ch[3] &&
+ '\n' == mp->req->query.prev_ch[2] ) {
+ mp->replayhead =
+ mp->in_boundary = 3;
+ } else {
+ mp->replayhead =
+ mp->in_boundary = 1;
+ }
} else
- if( '\r' == mp->req->query.prev_ch[0] &&
- '\n' == mp->req->query.prev_ch[1] &&
- '-' == ch ) {
- mp->in_boundary = 2;
- mp->replayhead = 2;
+ if( '-' == ch ) {
+ if( '\r' == mp->req->query.prev_ch[0] &&
+ '\n' == mp->req->query.prev_ch[1] ) {
+ mp->in_boundary = 2;
+ mp->replayhead = 2;
+ }
}
while( 0 <= ch ) {
- /* picohttp's query and header parsing is forgiving
- * regarding line termination. <CR><LF> or just <LF>
- * are accepted.
- * However multipart boundaries must be preceeded by
- * a <CR><LF> sequence, we're strict about that.
- */
- /* --- problematic conditional ---*/
- #if 0
- if( ( 0 == mp->in_boundary && '-' == ch &&
- '\r' == mp->req->query.prev_ch[0] &&
- '\n' == mp->req->query.prev_ch[1] ) ||
- ( 1 == mp->in_boundary && '-' == ch ) ||
- ( 1 < mp->in_boundary &&
- mp->req->query.multipartboundary[mp->in_boundary-2] == ch) ) {
- #endif
if( mp->req->query.multipartboundary[mp->in_boundary] == ch ) {
if( 0 == mp->req->query.multipartboundary[mp->in_boundary+1] ) {
mp->in_boundary = 0;
diff --git a/picohttp.h b/picohttp.h
index e3aa8a3..faa54de 100644
--- a/picohttp.h
+++ b/picohttp.h
@@ -5,8 +5,8 @@
#include <stddef.h>
#include <stdint.h>
-/* max 70 for boundary + 4 chars for "<CR><LF>--" */
-#define PICOHTTP_MULTIPARTBOUNDARY_MAX_LEN 74
+/* max 70 for boundary + 6 chars for "<CR><LF>--" */
+#define PICOHTTP_MULTIPARTBOUNDARY_MAX_LEN 76
#define PICOHTTP_DISPOSITION_NAME_MAX 16
#define PICOHTTP_MAJORVERSION(x) ( (x & 0x7f00) >> 8 )
@@ -124,7 +124,7 @@ struct picohttpRequest {
uint8_t contentencoding;
uint8_t transferencoding;
char multipartboundary[PICOHTTP_MULTIPARTBOUNDARY_MAX_LEN+1];
- char prev_ch[3];
+ char prev_ch[5];
} query;
struct {
char const *contenttype;