diff options
-rw-r--r-- | picohttp.c | 51 | ||||
-rw-r--r-- | picohttp.h | 4 |
2 files changed, 52 insertions, 3 deletions
@@ -225,6 +225,13 @@ static int16_t picohttpIoGetPercentCh( return ch; } +uint16_t picohttpGetch(struct picohttpRequest * const req) +{ + /* read HTTP query body, skipping over Chunked Transfer Boundaries + * if Chunked Transfer Encoding is used */ + +} + /* TODO: * It is possible to do in-place pattern matching on the route definition * array, without first reading in the URL and then processing it here. @@ -888,3 +895,47 @@ int picohttpResponseWrite ( return len; } +uint16_t picohttpMultipartGetch( + struct picohttpMultiPart * const mp); +{ + if( mp->replay + mp->in_boundary < 0) { + uint16_t ch = mp->replay < 1 ? '-' : + mp->req->query.multipartboundary[mp->replay - 1]; + mp->replay++; + return ch; + } else if( mp->finished) { + return -1; + } else { + uint16_t ch; + ch = picohttpIoGetch(mp->req->ioops); + if( 0 > ch ) { + return ch; + } + + if( (0 == mp->in_boundary && '\r' == ch) || + (1 == mp->in_boundary && '\n' == ch) || + (2 < mp->in_boundary && '-' == ch) || + (4 < mp->in_boundary && + mp->req->query.multipartboundary[mp->in_boundary-4] == ch) ) { + if( 5 < mp->in_boundary && + 0 == mp->req->query.multipartboundary[mp->in_boundary-3] ) { + /* matched boundary */ + mp->finished = 1; + return 0; + } + mp->in_boundary++; + ch = picohttpIoGetch(mp->req->ioops); + if( 0 >= ch ) { + return -1; + } + } else { + mp->replay = mp->in_boundary + 1; + return '-'; + } + } +} + + + + + @@ -165,9 +165,7 @@ int picohttpResponseWrite ( size_t len, char const *buf ); -uint16_t picohttpGetch( - struct picohttpRequest * const req, - struct picohttpChunkTransfer * const ct); +uint16_t picohttpGetch(struct picohttpRequest * const req); int picohttpMultipartNext( struct picohttpRequest * const req, |