"Fossies" - the Fresh Open Source Software Archive

Member "haproxy-2.0.0/include/proto/proto_http.h" (16 Jun 2019, 13813 Bytes) of package /linux/misc/haproxy-2.0.0.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 "proto_http.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.9.8_vs_2.0.0.

    1 /*
    2  * include/proto/proto_http.h
    3  * This file contains HTTP protocol definitions.
    4  *
    5  * Copyright (C) 2000-2011 Willy Tarreau - w@1wt.eu
    6  *
    7  * This library is free software; you can redistribute it and/or
    8  * modify it under the terms of the GNU Lesser General Public
    9  * License as published by the Free Software Foundation, version 2.1
   10  * exclusively.
   11  *
   12  * This library is distributed in the hope that it will be useful,
   13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   15  * Lesser General Public License for more details.
   16  *
   17  * You should have received a copy of the GNU Lesser General Public
   18  * License along with this library; if not, write to the Free Software
   19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
   20  */
   21 
   22 #ifndef _PROTO_PROTO_HTTP_H
   23 #define _PROTO_PROTO_HTTP_H
   24 
   25 #include <common/config.h>
   26 #include <types/proto_http.h>
   27 #include <types/stream.h>
   28 #include <types/task.h>
   29 #include <proto/channel.h>
   30 #include <proto/stream.h>
   31 
   32 extern struct pool_head *pool_head_uniqueid;
   33 
   34 int process_cli(struct stream *s);
   35 int process_srv_data(struct stream *s);
   36 int process_srv_conn(struct stream *s);
   37 int http_wait_for_request(struct stream *s, struct channel *req, int an_bit);
   38 int http_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px);
   39 int http_process_request(struct stream *s, struct channel *req, int an_bit);
   40 int http_process_tarpit(struct stream *s, struct channel *req, int an_bit);
   41 int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit);
   42 int http_send_name_header(struct stream *s, struct proxy* be, const char* svr_name);
   43 int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit);
   44 int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px);
   45 int http_request_forward_body(struct stream *s, struct channel *req, int an_bit);
   46 int http_response_forward_body(struct stream *s, struct channel *res, int an_bit);
   47 int http_upgrade_v09_to_v10(struct http_txn *txn);
   48 void http_msg_analyzer(struct http_msg *msg, struct hdr_idx *idx);
   49 void http_txn_reset_req(struct http_txn *txn);
   50 void http_txn_reset_res(struct http_txn *txn);
   51 const char *http_parse_reqline(struct http_msg *msg,
   52                                enum h1_state state, const char *ptr, const char *end,
   53                                unsigned int *ret_ptr, enum h1_state *ret_state);
   54 const char *http_parse_stsline(struct http_msg *msg,
   55                                enum h1_state state, const char *ptr, const char *end,
   56                                unsigned int *ret_ptr, enum h1_state *ret_state);
   57 int http_forward_trailers(struct http_msg *msg);
   58 int http_legacy_replace_header(struct hdr_idx *idx, struct http_msg *msg,
   59                                const char *name, unsigned int name_len,
   60                                const char *str, struct my_regex *re,
   61                                struct buffer *output);
   62 int http_legacy_replace_full_header(struct hdr_idx *idx, struct http_msg *msg,
   63                                     const char *name, unsigned int name_len,
   64                                     const char *str, struct my_regex *re,
   65                                     struct buffer *output);
   66 
   67 /* Export HTX analyzers and helpers */
   68 // FIXME: Rename all these functions http_* once legacy code will be removed
   69 struct htx;
   70 
   71 int htx_wait_for_request(struct stream *s, struct channel *req, int an_bit);
   72 int htx_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px);
   73 int htx_process_request(struct stream *s, struct channel *req, int an_bit);
   74 int htx_process_tarpit(struct stream *s, struct channel *req, int an_bit);
   75 int htx_wait_for_request_body(struct stream *s, struct channel *req, int an_bit);
   76 int htx_wait_for_response(struct stream *s, struct channel *rep, int an_bit);
   77 int htx_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px);
   78 int htx_request_forward_body(struct stream *s, struct channel *req, int an_bit);
   79 int htx_response_forward_body(struct stream *s, struct channel *res, int an_bit);
   80 int htx_apply_redirect_rule(struct redirect_rule *rule, struct stream *s, struct http_txn *txn);
   81 int htx_transform_header_str(struct stream* s, struct channel *chn, struct htx *htx,
   82                  struct ist name, const char *str, struct my_regex *re, int action);
   83 int htx_req_replace_stline(int action, const char *replace, int len,
   84                struct proxy *px, struct stream *s);
   85 void htx_res_set_status(unsigned int status, const char *reason, struct stream *s);
   86 void htx_check_request_for_cacheability(struct stream *s, struct channel *req);
   87 void htx_check_response_for_cacheability(struct stream *s, struct channel *res);
   88 int htx_send_name_header(struct stream *s, struct proxy *be, const char *srv_name);
   89 void htx_perform_server_redirect(struct stream *s, struct stream_interface *si);
   90 void htx_server_error(struct stream *s, struct stream_interface *si, int err, int finst, const struct buffer *msg);
   91 void htx_reply_and_close(struct stream *s, short status, struct buffer *msg);
   92 struct buffer *htx_error_message(struct stream *s);
   93 
   94 void debug_hdr(const char *dir, struct stream *s, const char *start, const char *end);
   95 int apply_filter_to_req_headers(struct stream *s, struct channel *req, struct hdr_exp *exp);
   96 int apply_filter_to_req_line(struct stream *s, struct channel *req, struct hdr_exp *exp);
   97 int apply_filters_to_request(struct stream *s, struct channel *req, struct proxy *px);
   98 int apply_filters_to_response(struct stream *s, struct channel *rtr, struct proxy *px);
   99 void manage_client_side_cookies(struct stream *s, struct channel *req);
  100 void manage_server_side_cookies(struct stream *s, struct channel *rtr);
  101 void check_request_for_cacheability(struct stream *s, struct channel *chn);
  102 void check_response_for_cacheability(struct stream *s, struct channel *rtr);
  103 int stats_check_uri(struct stream_interface *si, struct http_txn *txn, struct proxy *backend);
  104 int http_find_full_header2(const char *name, int len,
  105                            char *sol, struct hdr_idx *idx,
  106                            struct hdr_ctx *ctx);
  107 int http_find_header2(const char *name, int len,
  108               char *sol, struct hdr_idx *idx,
  109               struct hdr_ctx *ctx);
  110 int http_find_next_header(char *sol, struct hdr_idx *idx,
  111                           struct hdr_ctx *ctx);
  112 int http_remove_header2(struct http_msg *msg, struct hdr_idx *idx, struct hdr_ctx *ctx);
  113 int http_header_add_tail2(struct http_msg *msg, struct hdr_idx *hdr_idx, const char *text, int len);
  114 int http_replace_req_line(int action, const char *replace, int len, struct proxy *px, struct stream *s);
  115 void http_set_status(unsigned int status, const char *reason, struct stream *s);
  116 int http_transform_header_str(struct stream* s, struct http_msg *msg, const char* name,
  117                               unsigned int name_len, const char *str, struct my_regex *re,
  118                               int action);
  119 int http_handle_stats(struct stream *s, struct channel *req);
  120 enum rule_result http_req_get_intercept_rule(struct proxy *px, struct list *rules,
  121                          struct stream *s, int *deny_status);
  122 enum rule_result http_res_get_intercept_rule(struct proxy *px, struct list *rules,
  123                          struct stream *s);
  124 int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s, struct http_txn *txn);
  125 void http_perform_server_redirect(struct stream *s, struct stream_interface *si);
  126 void http_return_srv_error(struct stream *s, struct stream_interface *si);
  127 void http_capture_headers(char *som, struct hdr_idx *idx,
  128               char **cap, struct cap_hdr *cap_hdr);
  129 void http_capture_bad_message(struct proxy *proxy, struct stream *s,
  130                               struct http_msg *msg,
  131                   enum h1_state state, struct proxy *other_end);
  132 unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hlen,
  133               struct hdr_idx *idx, int occ,
  134               struct hdr_ctx *ctx, char **vptr, size_t *vlen);
  135 unsigned int http_get_fhdr(const struct http_msg *msg, const char *hname, int hlen,
  136                struct hdr_idx *idx, int occ,
  137                struct hdr_ctx *ctx, char **vptr, size_t *vlen);
  138 char *http_txn_get_path(const struct http_txn *txn);
  139 
  140 struct http_txn *http_alloc_txn(struct stream *s);
  141 void http_init_txn(struct stream *s);
  142 void http_end_txn(struct stream *s);
  143 void http_reset_txn(struct stream *s);
  144 void http_end_txn_clean_session(struct stream *s);
  145 void http_resync_states(struct stream *s);
  146 void http_parse_connection_header(struct http_txn *txn, struct http_msg *msg, int to_del);
  147 void http_change_connection_header(struct http_txn *txn, struct http_msg *msg, int wanted);
  148 void http_adjust_conn_mode(struct stream *s, struct http_txn *txn, struct http_msg *msg);
  149 
  150 int http_msg_forward_body(struct stream *s, struct http_msg *msg);
  151 int http_msg_forward_chunked_body(struct stream *s, struct http_msg *msg);
  152 
  153 void http_reply_and_close(struct stream *s, short status, struct buffer *msg);
  154 struct buffer *http_error_message(struct stream *s);
  155 
  156 /* to be used when contents change in an HTTP message */
  157 #define http_msg_move_end(msg, bytes) do { \
  158         unsigned int _bytes = (bytes);  \
  159         (msg)->next += (_bytes);    \
  160         (msg)->sov += (_bytes);     \
  161         (msg)->eoh += (_bytes);     \
  162     } while (0)
  163 
  164 
  165 /* Return the amount of bytes that need to be rewound before buf->p to access
  166  * the current message's headers. The purpose is to be able to easily fetch
  167  * the message's beginning before headers are forwarded, as well as after.
  168  * The principle is that msg->eoh and msg->eol are immutable while msg->sov
  169  * equals the sum of the two before forwarding and is zero after forwarding,
  170  * so the difference cancels the rewinding.
  171  */
  172 static inline int http_hdr_rewind(const struct http_msg *msg)
  173 {
  174     return msg->eoh + msg->eol - msg->sov;
  175 }
  176 
  177 /* Return the amount of bytes that need to be rewound before buf->p to access
  178  * the current message's URI. The purpose is to be able to easily fetch
  179  * the message's beginning before headers are forwarded, as well as after.
  180  */
  181 static inline int http_uri_rewind(const struct http_msg *msg)
  182 {
  183     return http_hdr_rewind(msg) - msg->sl.rq.u;
  184 }
  185 
  186 /* Return the amount of bytes that need to be rewound before buf->p to access
  187  * the current message's BODY. The purpose is to be able to easily fetch
  188  * the message's beginning before headers are forwarded, as well as after.
  189  */
  190 static inline int http_body_rewind(const struct http_msg *msg)
  191 {
  192     return http_hdr_rewind(msg) - msg->eoh - msg->eol;
  193 }
  194 
  195 /* Return the amount of bytes that need to be rewound before buf->p to access
  196  * the current message's DATA. The difference with the function above is that
  197  * if a chunk is present and has already been parsed, its size is skipped so
  198  * that the byte pointed to is the first byte of actual data. The function is
  199  * safe for use in state HTTP_MSG_DATA regardless of whether the headers were
  200  * already forwarded or not.
  201  */
  202 static inline int http_data_rewind(const struct http_msg *msg)
  203 {
  204     return http_body_rewind(msg) - msg->sol;
  205 }
  206 
  207 /* Return the maximum amount of bytes that may be read after the beginning of
  208  * the message body, according to the advertised length. The function is safe
  209  * for use between HTTP_MSG_BODY and HTTP_MSG_DATA regardless of whether the
  210  * headers were already forwarded or not.
  211  */
  212 static inline int http_body_bytes(const struct http_msg *msg)
  213 {
  214     int len;
  215 
  216     len = ci_data(msg->chn) - msg->sov - msg->sol;
  217     if (len > msg->body_len)
  218         len = msg->body_len;
  219     return len;
  220 }
  221 
  222 /* for debugging, reports the HTTP/1 message state name (legacy version) */
  223 static inline const char *h1_msg_state_str(enum h1_state msg_state)
  224 {
  225     switch (msg_state) {
  226     case HTTP_MSG_RQBEFORE:    return "MSG_RQBEFORE";
  227     case HTTP_MSG_RQBEFORE_CR: return "MSG_RQBEFORE_CR";
  228     case HTTP_MSG_RQMETH:      return "MSG_RQMETH";
  229     case HTTP_MSG_RQMETH_SP:   return "MSG_RQMETH_SP";
  230     case HTTP_MSG_RQURI:       return "MSG_RQURI";
  231     case HTTP_MSG_RQURI_SP:    return "MSG_RQURI_SP";
  232     case HTTP_MSG_RQVER:       return "MSG_RQVER";
  233     case HTTP_MSG_RQLINE_END:  return "MSG_RQLINE_END";
  234     case HTTP_MSG_RPBEFORE:    return "MSG_RPBEFORE";
  235     case HTTP_MSG_RPBEFORE_CR: return "MSG_RPBEFORE_CR";
  236     case HTTP_MSG_RPVER:       return "MSG_RPVER";
  237     case HTTP_MSG_RPVER_SP:    return "MSG_RPVER_SP";
  238     case HTTP_MSG_RPCODE:      return "MSG_RPCODE";
  239     case HTTP_MSG_RPCODE_SP:   return "MSG_RPCODE_SP";
  240     case HTTP_MSG_RPREASON:    return "MSG_RPREASON";
  241     case HTTP_MSG_RPLINE_END:  return "MSG_RPLINE_END";
  242     case HTTP_MSG_HDR_FIRST:   return "MSG_HDR_FIRST";
  243     case HTTP_MSG_HDR_NAME:    return "MSG_HDR_NAME";
  244     case HTTP_MSG_HDR_COL:     return "MSG_HDR_COL";
  245     case HTTP_MSG_HDR_L1_SP:   return "MSG_HDR_L1_SP";
  246     case HTTP_MSG_HDR_L1_LF:   return "MSG_HDR_L1_LF";
  247     case HTTP_MSG_HDR_L1_LWS:  return "MSG_HDR_L1_LWS";
  248     case HTTP_MSG_HDR_VAL:     return "MSG_HDR_VAL";
  249     case HTTP_MSG_HDR_L2_LF:   return "MSG_HDR_L2_LF";
  250     case HTTP_MSG_HDR_L2_LWS:  return "MSG_HDR_L2_LWS";
  251     case HTTP_MSG_LAST_LF:     return "MSG_LAST_LF";
  252     case HTTP_MSG_ERROR:       return "MSG_ERROR";
  253     case HTTP_MSG_BODY:        return "MSG_BODY";
  254     case HTTP_MSG_100_SENT:    return "MSG_100_SENT";
  255     case HTTP_MSG_CHUNK_SIZE:  return "MSG_CHUNK_SIZE";
  256     case HTTP_MSG_DATA:        return "MSG_DATA";
  257     case HTTP_MSG_CHUNK_CRLF:  return "MSG_CHUNK_CRLF";
  258     case HTTP_MSG_TRAILERS:    return "MSG_TRAILERS";
  259     case HTTP_MSG_ENDING:      return "MSG_ENDING";
  260     case HTTP_MSG_DONE:        return "MSG_DONE";
  261     case HTTP_MSG_CLOSING:     return "MSG_CLOSING";
  262     case HTTP_MSG_CLOSED:      return "MSG_CLOSED";
  263     case HTTP_MSG_TUNNEL:      return "MSG_TUNNEL";
  264     default:                   return "MSG_??????";
  265     }
  266 }
  267 
  268 #endif /* _PROTO_PROTO_HTTP_H */
  269 
  270 /*
  271  * Local variables:
  272  *  c-indent-level: 8
  273  *  c-basic-offset: 8
  274  * End:
  275  */