diff options
author | Wolfgang Draxinger <Wolfgang.Draxinger@physik.uni-muenchen.de> | 2013-06-25 16:06:55 +0200 |
---|---|---|
committer | Wolfgang Draxinger <Wolfgang.Draxinger@physik.uni-muenchen.de> | 2013-06-25 16:06:55 +0200 |
commit | 1fb50bb9c2c971691a93a844a1c3e6b84cdcca31 (patch) | |
tree | 55d5bb4ae123e9a4b9a6b7fed66d8972d2c5fca8 | |
parent | 2c6b42c55b3db99c664de543f32f2434948c5916 (diff) | |
download | litheweb-1fb50bb9c2c971691a93a844a1c3e6b84cdcca31.tar.gz litheweb-1fb50bb9c2c971691a93a844a1c3e6b84cdcca31.tar.bz2 |
still superfluous <CR><LF><CR> at end of multipart block
-rw-r--r-- | picohttp.c | 75 | ||||
-rw-r--r-- | picohttp.h | 6 |
2 files changed, 44 insertions, 37 deletions
@@ -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; @@ -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; |