"Fossies" - the Fresh Open Source Software Archive

Member "haproxy-1.9.8/include/common/http.h" (13 May 2019, 7321 Bytes) of package /linux/misc/haproxy-1.9.8.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "http.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.9.6_vs_1.9.7.

    1 /*
    2  * include/common/http.h
    3  *
    4  * Version-agnostic and implementation-agnostic HTTP protocol definitions.
    5  *
    6  * Copyright (C) 2000-2018 Willy Tarreau - w@1wt.eu
    7  *
    8  * This library is free software; you can redistribute it and/or
    9  * modify it under the terms of the GNU Lesser General Public
   10  * License as published by the Free Software Foundation, version 2.1
   11  * exclusively.
   12  *
   13  * This library is distributed in the hope that it will be useful,
   14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   16  * Lesser General Public License for more details.
   17  *
   18  * You should have received a copy of the GNU Lesser General Public
   19  * License along with this library; if not, write to the Free Software
   20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   21  */
   22 
   23 #ifndef _COMMON_HTTP_H
   24 #define _COMMON_HTTP_H
   25 
   26 #include <common/buf.h>
   27 #include <common/ist.h>
   28 
   29 /*
   30  * some macros mainly used when parsing header fileds.
   31  * from RFC7230:
   32  *   CTL                 = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
   33  *   SEP                 = one of the 17 defined separators or SP or HT
   34  *   LWS                 = CR, LF, SP or HT
   35  *   SPHT                = SP or HT. Use this macro and not a boolean expression for best speed.
   36  *   CRLF                = CR or LF. Use this macro and not a boolean expression for best speed.
   37  *   token               = any CHAR except CTL or SEP. Use this macro and not a boolean expression for best speed.
   38  *
   39  * added for ease of use:
   40  *   ver_token           = 'H', 'P', 'T', '/', '.', and digits.
   41  */
   42 #define HTTP_FLG_CTL  0x01
   43 #define HTTP_FLG_SEP  0x02
   44 #define HTTP_FLG_LWS  0x04
   45 #define HTTP_FLG_SPHT 0x08
   46 #define HTTP_FLG_CRLF 0x10
   47 #define HTTP_FLG_TOK  0x20
   48 #define HTTP_FLG_VER  0x40
   49 #define HTTP_FLG_DIG  0x80
   50 
   51 #define HTTP_IS_CTL(x)       (http_char_classes[(uint8_t)(x)] & HTTP_FLG_CTL)
   52 #define HTTP_IS_SEP(x)       (http_char_classes[(uint8_t)(x)] & HTTP_FLG_SEP)
   53 #define HTTP_IS_LWS(x)       (http_char_classes[(uint8_t)(x)] & HTTP_FLG_LWS)
   54 #define HTTP_IS_SPHT(x)      (http_char_classes[(uint8_t)(x)] & HTTP_FLG_SPHT)
   55 #define HTTP_IS_CRLF(x)      (http_char_classes[(uint8_t)(x)] & HTTP_FLG_CRLF)
   56 #define HTTP_IS_TOKEN(x)     (http_char_classes[(uint8_t)(x)] & HTTP_FLG_TOK)
   57 #define HTTP_IS_VER_TOKEN(x) (http_char_classes[(uint8_t)(x)] & HTTP_FLG_VER)
   58 #define HTTP_IS_DIGIT(x)     (http_char_classes[(uint8_t)(x)] & HTTP_FLG_DIG)
   59 
   60 /* Known HTTP methods */
   61 enum http_meth_t {
   62     HTTP_METH_OPTIONS,
   63     HTTP_METH_GET,
   64     HTTP_METH_HEAD,
   65     HTTP_METH_POST,
   66     HTTP_METH_PUT,
   67     HTTP_METH_DELETE,
   68     HTTP_METH_TRACE,
   69     HTTP_METH_CONNECT,
   70     HTTP_METH_OTHER, /* Must be the last entry */
   71 } __attribute__((packed));
   72 
   73 /* Known HTTP authentication schemes */
   74 enum ht_auth_m {
   75     HTTP_AUTH_WRONG     = -1,       /* missing or unknown */
   76     HTTP_AUTH_UNKNOWN   = 0,
   77     HTTP_AUTH_BASIC,
   78     HTTP_AUTH_DIGEST,
   79 } __attribute__((packed));
   80 
   81 /* All implemented HTTP status codes */
   82 enum {
   83     HTTP_ERR_200 = 0,
   84     HTTP_ERR_400,
   85     HTTP_ERR_403,
   86     HTTP_ERR_405,
   87     HTTP_ERR_408,
   88     HTTP_ERR_421,
   89     HTTP_ERR_425,
   90     HTTP_ERR_429,
   91     HTTP_ERR_500,
   92     HTTP_ERR_502,
   93     HTTP_ERR_503,
   94     HTTP_ERR_504,
   95     HTTP_ERR_SIZE
   96 };
   97 
   98 /* Note: the strings below make use of chunks. Chunks may carry an allocated
   99  * size in addition to the length. The size counts from the beginning (str)
  100  * to the end. If the size is unknown, it MUST be zero, in which case the
  101  * sample will automatically be duplicated when a change larger than <len> has
  102  * to be performed. Thus it is safe to always set size to zero.
  103  */
  104 struct http_meth {
  105     enum http_meth_t meth;
  106     struct buffer str;
  107 };
  108 
  109 struct http_auth_data {
  110     enum ht_auth_m method;                /* one of HTTP_AUTH_* */
  111     /* 7 bytes unused here */
  112     struct buffer method_data;            /* points to the creditial part from 'Authorization:' header */
  113     char *user, *pass;                    /* extracted username & password */
  114 };
  115 
  116 struct http_method_desc {
  117     enum http_meth_t meth;
  118     const struct ist text;
  119 };
  120 
  121 extern const int http_err_codes[HTTP_ERR_SIZE];
  122 extern const char *http_err_msgs[HTTP_ERR_SIZE];
  123 extern struct buffer http_err_chunks[HTTP_ERR_SIZE];
  124 extern const struct ist http_known_methods[HTTP_METH_OTHER];
  125 extern const uint8_t http_char_classes[256];
  126 
  127 extern const struct ist HTTP_100;
  128 extern const struct ist HTTP_103;
  129 extern const char *HTTP_301;
  130 extern const char *HTTP_302;
  131 extern const char *HTTP_303;
  132 extern const char *HTTP_307;
  133 extern const char *HTTP_308;
  134 extern const char *HTTP_401_fmt;
  135 extern const char *HTTP_407_fmt;
  136 
  137 int init_http(char **err);
  138 enum http_meth_t find_http_meth(const char *str, const int len);
  139 const int http_get_status_idx(unsigned int status);
  140 const char *http_get_reason(unsigned int status);
  141 struct ist http_get_path(const struct ist uri);
  142 int http_header_match2(const char *hdr, const char *end,
  143                        const char *name, int len);
  144 char *http_find_hdr_value_end(char *s, const char *e);
  145 char *http_find_cookie_value_end(char *s, const char *e);
  146 char *http_extract_cookie_value(char *hdr, const char *hdr_end,
  147                                 char *cookie_name, size_t cookie_name_l,
  148                                 int list, char **value, size_t *value_l);
  149 int http_parse_qvalue(const char *qvalue, const char **end);
  150 const char *http_find_url_param_pos(const char **chunks,
  151                                     const char* url_param_name,
  152                                     size_t url_param_name_l, char delim);
  153 int http_find_next_url_param(const char **chunks,
  154                              const char* url_param_name, size_t url_param_name_l,
  155                              const char **vstart, const char **vend, char delim);
  156 
  157 int http_parse_header(const struct ist hdr, struct ist *name, struct ist *value);
  158 int http_parse_stline(const struct ist line, struct ist *p1, struct ist *p2, struct ist *p3);
  159 
  160 /*
  161  * Given a path string and its length, find the position of beginning of the
  162  * query string. Returns NULL if no query string is found in the path.
  163  *
  164  * Example: if path = "/foo/bar/fubar?yo=mama;ye=daddy", and n = 22:
  165  *
  166  * find_query_string(path, n, '?') points to "yo=mama;ye=daddy" string.
  167  */
  168 static inline char *http_find_param_list(char *path, size_t path_l, char delim)
  169 {
  170     char *p;
  171 
  172     p = memchr(path, delim, path_l);
  173     return p ? p + 1 : NULL;
  174 }
  175 
  176 static inline int http_is_param_delimiter(char c, char delim)
  177 {
  178     return c == '&' || c == ';' || c == delim;
  179 }
  180 
  181 /* Match language range with language tag. RFC2616 14.4:
  182  *
  183  *    A language-range matches a language-tag if it exactly equals
  184  *    the tag, or if it exactly equals a prefix of the tag such
  185  *    that the first tag character following the prefix is "-".
  186  *
  187  * Return 1 if the strings match, else return 0.
  188  */
  189 static inline int http_language_range_match(const char *range, int range_len,
  190                                             const char *tag, int tag_len)
  191 {
  192     const char *end = range + range_len;
  193     const char *tend = tag + tag_len;
  194 
  195     while (range < end) {
  196         if (*range == '-' && tag == tend)
  197             return 1;
  198         if (*range != *tag || tag == tend)
  199             return 0;
  200         range++;
  201         tag++;
  202     }
  203     /* Return true only if the last char of the tag is matched. */
  204     return tag == tend;
  205 }
  206 
  207 
  208 #endif /* _COMMON_HTTP_H */
  209 
  210 /*
  211  * Local variables:
  212  *  c-indent-level: 8
  213  *  c-basic-offset: 8
  214  * End:
  215  */