📄 http_basic.c
字号:
* header. * * The http_referer_t is defined as follows: * @code * typedef struct http_referer_s * { * msg_common_t loc_common[1]; * msg_error_t *loc_next; * url_t loc_url[1]; * } http_referer_t; * @endcode */#define http_referer_d http_location_d#define http_referer_e http_location_emsg_hclass_t http_referer_class[] =HTTP_HEADER_CLASS(referer, "Referer", loc_common, single, location);/* ====================================================================== *//**@HTTP_HEADER http_mime_version MIME-Version header. * * We use MIME MIME-Version header. *//* ====================================================================== *//**@HTTP_HEADER http_retry_after Retry-After header. * * The Retry-After response-header field can be used with a 503 (Service * Unavailable) response to indicate how long the service is expected to be * unavailable to the requesting client. This field MAY also be used with * any 3xx (Redirection) response to indicate the minimum time the * user-agent is asked wait before issuing the redirected request. Its * syntax is defined in RFC 2616 section 14.37 as follows: * * @code * Retry-After = "Retry-After" ":" ( HTTP-date / delta-seconds ) * @endcode * *//**@ingroup http_retry_after * @typedef typedef struct http_retry_after_s http_retry_after_t; * * The structure #http_retry_after_t contains representation of @b * Retry-After header. * * The #http_retry_after_t is defined as follows: * @code * typedef struct { * msg_common_t ra_common[1]; // Common fragment info * msg_error_t *ra_next; // Link to next (dummy) * http_time_t ra_date; // When to retry * http_time_t ra_delta; // Seconds to before retry * } http_retry_after_t; * @endcode */int http_retry_after_d(su_home_t *home, http_header_t *h, char *s, int slen){ http_retry_after_t *ra = h->sh_retry_after; if (msg_date_delta_d((char const **)&s, &ra->ra_date, &ra->ra_delta) < 0 || *s) return -1; else return 0;}int http_retry_after_e(char b[], int bsiz, http_header_t const *h, int f){ http_retry_after_t const *ra = h->sh_retry_after; if (ra->ra_date) return msg_date_e(b, bsiz, ra->ra_date + ra->ra_delta); else return msg_delta_e(b, bsiz, ra->ra_delta);}msg_hclass_t http_retry_after_class[] =HTTP_HEADER_CLASS(retry_after, "Retry-After", ra_common, single, default);/* ====================================================================== *//**@HTTP_HEADER http_server Server header. */#define http_server_d msg_generic_d#define http_server_e msg_generic_emsg_hclass_t http_server_class[] =HTTP_HEADER_CLASS_G(server, "Server", single);/* ====================================================================== *//**@HTTP_HEADER http_te TE header. * * The TE request-header field indicates what extension transfer-codings it * is willing to accept in the response and whether or not it is willing to * accept trailer fields in a chunked transfer-coding. Its value may consist * of the keyword "trailers" and/or a comma-separated list of extension * transfer-coding names with optional accept parameters. Its syntax is * defined in [H14.39] as follows: * * @code * TE = "TE" ":" #( t-codings ) * t-codings = "trailers" | ( transfer-extension [ accept-params ] ) * @endcode * *//**@ingroup http_te * @typedef typedef strucy http_te_s http_te_t; * * The structure http_te_t contains representation of @b TE header. * * The http_te_t is defined as follows: * @code * typedef struct http_te_s { * } http_te_t; * @endcode */static inlinevoid http_te_update(http_te_t *te){ te->te_q = msg_header_find_param(te->te_common, "q");}int http_te_d(su_home_t *home, msg_header_t *h, char *s, int slen){ msg_header_t **hh = &h->sh_succ, *h0 = h; http_te_t *te = (http_te_t *)h; assert(h); assert(sizeof(*h)); for (;*s;) { /* Ignore empty entries (comma-whitespace) */ if (*s == ',') { *s++ = '\0'; skip_lws(&s); continue; } if (!h) { /* Allocate next header structure */ if (!(h = msg_header_alloc(home, h0->sh_class, 0))) break; *hh = h; h->sh_prev = hh; hh = &h->sh_succ; te = te->te_next = (http_te_t *)h; } /* "TE:" #(transfer-extension ; *(parameters))) */ if (msg_token_d(&s, &te->te_extension) == -1) return -1; if (*s == ';' && msg_params_d(home, &s, &te->te_params) == -1) return -1; if (*s != '\0' && *s != ',') return -1; if (te->te_params) http_te_update(te); h = NULL; } return 0;}int http_te_e(char b[], int bsiz, msg_header_t const *h, int flags){ char *b0 = b, *end = b + bsiz; http_te_t const *te = (http_te_t *)h; assert(http_is_te(h)); MSG_STRING_E(b, end, te->te_extension); MSG_PARAMS_E(b, end, te->te_params, flags); MSG_TERM_E(b, end); return b - b0;}int http_te_dup_xtra(msg_header_t const *h, int offset){ int rv = offset; http_te_t const *te = (http_te_t const *)h; MSG_PARAMS_SIZE(rv, te->te_params); rv += MSG_STRING_SIZE(te->te_extension); return rv;}/** Duplicate one http_te_t object */char *http_te_dup_one(msg_header_t *dst, msg_header_t const *src, char *b, int xtra){ http_te_t *te = (http_te_t *)dst; http_te_t const *o = (http_te_t const *)src; char *end = b + xtra; b = msg_params_dup(&te->te_params, o->te_params, b, xtra); MSG_STRING_DUP(b, te->te_extension, o->te_extension); if (te->te_params) http_te_update(te); assert(b <= end); return b;}msg_hclass_t http_te_class[] =HTTP_HEADER_CLASS(te, "TE", te_params, append, te);/* ====================================================================== *//**@HTTP_HEADER http_trailer Trailer header. */#define http_trailer_d msg_list_d#define http_trailer_e msg_list_emsg_hclass_t http_trailer_class[] =HTTP_HEADER_CLASS_LIST(trailer, "Trailer", list_critical);/* ====================================================================== *//**@HTTP_HEADER http_transfer_encoding Transfer-Encoding header. */#define http_transfer_encoding_d msg_list_d#define http_transfer_encoding_e msg_list_emsg_hclass_t http_transfer_encoding_class[] =HTTP_HEADER_CLASS_LIST(transfer_encoding, "Transfer-Encoding", list_critical);/* ====================================================================== *//**@HTTP_HEADER http_upgrade Upgrade header. */#define http_upgrade_d msg_list_d#define http_upgrade_e msg_list_emsg_hclass_t http_upgrade_class[] =HTTP_HEADER_CLASS_LIST(upgrade, "Upgrade", list_critical);/* ====================================================================== *//**@HTTP_HEADER http_user_agent User-Agent header. */#define http_user_agent_d msg_generic_d#define http_user_agent_e msg_generic_emsg_hclass_t http_user_agent_class[] =HTTP_HEADER_CLASS_G(user_agent, "User-Agent", single);/* ====================================================================== *//**@HTTP_HEADER http_vary Vary header. */#define http_vary_d msg_list_d#define http_vary_e msg_list_emsg_hclass_t http_vary_class[] =HTTP_HEADER_CLASS_LIST(vary, "Vary", list);/* ====================================================================== *//**@HTTP_HEADER http_via Via header. * * @code * Via = "Via" ":" 1#( received-protocol received-by [ comment ] ) * received-protocol = [ protocol-name "/" ] protocol-version * protocol-name = token * protocol-version = token * received-by = ( host [ ":" port ] ) | pseudonym * pseudonym = token * @endcode */int http_via_d(su_home_t *home, http_header_t *h, char *s, int slen){ http_header_t **hh = &h->sh_succ, *h0 = h; http_via_t *v = h->sh_via; assert(h && h->sh_class); for (;*s;) { /* Ignore empty entries (comma-whitespace) */ if (*s == ',') { *s++ = '\0'; skip_lws(&s); continue; } if (!h) { /* Allocate next header structure */ if (!(h = msg_header_alloc(home, h0->sh_class, 0))) return -1; *hh = h; h->sh_prev = hh; hh = &h->sh_succ; v = v->v_next = h->sh_via; } if (http_version_d(&s, &v->v_version) == -1) /* Parse protocol version */ return -1; if (msg_hostport_d(&s, &v->v_host, &v->v_port) == -1) /* Host (and port) */ return -1; if (*s == '(' && msg_comment_d(&s, &v->v_comment) == -1) /* Comment */ return -1; if (*s != '\0' && *s != ',') /* Extra before next header field? */ return -1; h = NULL; } if (h) /* List without valid header via */ return -1; return 0;}int http_via_e(char b[], int bsiz, http_header_t const *h, int flags){ int const compact = MSG_IS_COMPACT(flags); char *b0 = b, *end = b + bsiz; http_via_t const *v = h->sh_via; MSG_STRING_E(b, end, v->v_version); MSG_CHAR_E(b, end, ' '); MSG_STRING_E(b, end, v->v_host); if (v->v_port) { MSG_CHAR_E(b, end, ':'); MSG_STRING_E(b, end, v->v_port); } if (v->v_comment) { if (!compact) MSG_CHAR_E(b, end, ' '); MSG_CHAR_E(b, end, '('); MSG_STRING_E(b, end, v->v_comment); MSG_CHAR_E(b, end, ')'); } MSG_TERM_E(b, end); return b - b0;}static int http_via_dup_xtra(http_header_t const *h, int offset){ http_via_t const *v = h->sh_via; offset += MSG_STRING_SIZE(v->v_version); offset += MSG_STRING_SIZE(v->v_host); offset += MSG_STRING_SIZE(v->v_port); offset += MSG_STRING_SIZE(v->v_comment); return offset;}/** Duplicate one http_via_t object */static char *http_via_dup_one(http_header_t *dst, http_header_t const *src, char *b, int xtra){ http_via_t *v = dst->sh_via; http_via_t const *o = src->sh_via; char *end = b + xtra; MSG_STRING_DUP(b, v->v_version, o->v_version); MSG_STRING_DUP(b, v->v_host, o->v_host); MSG_STRING_DUP(b, v->v_port, o->v_port); MSG_STRING_DUP(b, v->v_comment, o->v_comment); assert(b <= end); return b;}msg_hclass_t http_via_class[] =HTTP_HEADER_CLASS(via, "Via", v_common, prepend, via);/* ====================================================================== *//**@HTTP_HEADER http_warning Warning header. */#define http_warning_d msg_warning_d#define http_warning_e msg_warning_e#define http_warning_dup_xtra msg_warning_dup_xtra#define http_warning_dup_one msg_warning_dup_onemsg_hclass_t http_warning_class[] = HTTP_HEADER_CLASS(warning, "Warning", w_common, append, warning);/* ====================================================================== *//**@HTTP_HEADER http_www_authenticate WWW-Authenticate header. */#define http_www_authenticate_d msg_auth_d#define http_www_authenticate_e msg_auth_emsg_hclass_t http_www_authenticate_class[] =HTTP_HEADER_CLASS_AUTH(www_authenticate, "WWW-Authenticate", single);/* ====================================================================== *//**@HTTP_HEADER http_error Erroneous headers. * * We use erroneous header object from @b msg module. *//* ====================================================================== *//**@HTTP_HEADER http_unknown Unknown headers. * * We use unknown header object from @b msg module. *//* ====================================================================== *//**@HTTP_HEADER http_separator Header separator. * * We use header separator object from @b msg module. *//* ====================================================================== *//**@HTTP_HEADER http_payload Message payload. * * We use message body object from @b msg module. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -