2 * Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase,
5 * The software is licensed under either the MIT License (below) or the Perl
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to
10 * deal in the Software without restriction, including without limitation the
11 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 * sell copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
27 #ifndef picohttpparser_h
28 #define picohttpparser_h
30 #include <sys/types.h>
33 #define ssize_t intptr_t
40 /* contains name and value of a header (name == NULL if is a continuing line
41 * of a multiline header */
49 /* returns number of bytes consumed if successful, -2 if request is partial,
51 int phr_parse_request(const char *buf
, size_t len
, const char **method
, size_t *method_len
, const char **path
, size_t *path_len
,
52 int *major_version
, int *minor_version
, struct phr_header
*headers
, size_t *num_headers
, size_t last_len
);
55 int phr_parse_response(const char *_buf
, size_t len
, int *major_version
, int *minor_version
, int *status
, const char **msg
, size_t *msg_len
,
56 struct phr_header
*headers
, size_t *num_headers
, size_t last_len
);
59 int phr_parse_headers(const char *buf
, size_t len
, struct phr_header
*headers
, size_t *num_headers
, size_t last_len
);
61 /* should be zero-filled before start */
62 struct phr_chunked_decoder
{
63 size_t bytes_left_in_chunk
; /* number of bytes left in current chunk */
64 char consume_trailer
; /* if trailing headers should be consumed */
69 /* the function rewrites the buffer given as (buf, bufsz) removing the chunked-
70 * encoding headers. When the function returns without an error, bufsz is
71 * updated to the length of the decoded data available. Applications should
72 * repeatedly call the function while it returns -2 (incomplete) every time
73 * supplying newly arrived data. If the end of the chunked-encoded data is
74 * found, the function returns a non-negative number indicating the number of
75 * octets left undecoded at the tail of the supplied buffer. Returns -1 on
78 ssize_t
phr_decode_chunked(struct phr_chunked_decoder
*decoder
, char *buf
, size_t *bufsz
);
80 /* returns if the chunked decoder is in middle of chunked data */
81 int phr_decode_chunked_is_in_data(struct phr_chunked_decoder
*decoder
);