diff --git a/qse/cmd/http/httpd.c b/qse/cmd/http/httpd.c index 2d5e43c3..428f6399 100644 --- a/qse/cmd/http/httpd.c +++ b/qse/cmd/http/httpd.c @@ -189,8 +189,9 @@ struct loccfg_t unsigned int allow_http: 1; unsigned int allow_connect: 1; unsigned int allow_intercept: 1; + unsigned int allow_upgrade: 1; unsigned int dns_enabled: 1; - unsigned int urs_enabled: 2; + unsigned int urs_enabled: 1; qse_nwad_t dns_nwad; /* TODO: multiple dns */ qse_nwad_t urs_nwad; /* TODO: multiple urs */ int dns_timeout; @@ -228,8 +229,7 @@ struct server_xtn_t qse_httpd_serverstd_freersrc_t orgfreersrc; qse_httpd_serverstd_query_t orgquery; - - qse_htb_t* cfgtab; + qse_htb_t* cfgtab; /* key: host name, value: server_hostcfg_t */ }; /* --------------------------------------------------------------------- */ @@ -371,14 +371,14 @@ int cl_i = 0; system ("printenv"); cl = getenv("CONTENT_LENGTH"); if (cl) cl_i = atoi(cl); -//if (cl_i) -//{ +/*if (cl_i) +{ */ while (fgets (buf, sizeof(buf), stdin) != NULL) { printf ("%s", buf); } -//} -// system ("while read xxx; do echo $xxx; done; echo 123 456 789"); +/*} + system ("while read xxx; do echo $xxx; done; echo 123 456 789");*/ printf ("\n"); return 0; @@ -614,6 +614,11 @@ proxy_ok: root->u.proxy.urs_prerewrite_mod = loccfg->proxy.urs_prerewrite_mod; } + if (loccfg->proxy.allow_upgrade) + { + root->u.proxy.flags |= QSE_HTTPD_RSRC_PROXY_ALLOW_UPGRADE; + } + return 0; } @@ -1436,7 +1441,6 @@ static int load_loccfg_access (qse_httpd_t* httpd, qse_xli_t* xli, qse_xli_list_ return 0; } - static int load_loccfg_proxy (qse_httpd_t* httpd, qse_xli_t* xli, qse_xli_list_t* list, loccfg_t* cfg) { qse_xli_pair_t* pair; @@ -1472,6 +1476,11 @@ static int load_loccfg_proxy (qse_httpd_t* httpd, qse_xli_t* xli, qse_xli_list_t if (!pair && default_proxy) pair = qse_xli_findpair (xli, default_proxy, QSE_T("intercept")); if (pair) cfg->proxy.allow_intercept = get_boolean ((qse_xli_str_t*)pair->val); + pair = QSE_NULL; + if (proxy) pair = qse_xli_findpair (xli, proxy, QSE_T("upgrade")); + if (!pair && default_proxy) pair = qse_xli_findpair (xli, default_proxy, QSE_T("upgrade")); + if (pair) cfg->proxy.allow_upgrade = get_boolean ((qse_xli_str_t*)pair->val); + pair = QSE_NULL; if (proxy) pair = qse_xli_findpair (xli, proxy, QSE_T("pseudonym")); if (!pair && default_proxy) pair = qse_xli_findpair (xli, default_proxy, QSE_T("pseudonym")); @@ -1949,6 +1958,7 @@ static int open_config_file (qse_httpd_t* httpd) { QSE_T("server-default.proxy.http"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server-default.proxy.connect"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server-default.proxy.intercept"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, + { QSE_T("server-default.proxy.upgrade"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server-default.proxy.pseudonym"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server-default.proxy.dns-enabled"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server-default.proxy.dns-server"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, @@ -2005,6 +2015,7 @@ static int open_config_file (qse_httpd_t* httpd) { QSE_T("server.host.location.proxy.http"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server.host.location.proxy.connect"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server.host.location.proxy.intercept"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, + { QSE_T("server.host.location.proxy.upgrade"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server.host.location.proxy.pseudonym"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server.host.location.proxy.dns-enabled"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, { QSE_T("server.host.location.proxy.dns-server"), { QSE_XLI_SCM_VALSTR | QSE_XLI_SCM_KEYNODUP, 1, 1 } }, diff --git a/qse/cmd/http/httpd.conf b/qse/cmd/http/httpd.conf index eb7d1fd3..076eedb3 100644 --- a/qse/cmd/http/httpd.conf +++ b/qse/cmd/http/httpd.conf @@ -136,6 +136,7 @@ server-default { http = yes; connect = yes; intercept = yes; + upgrade = yes; #pseudonym = "nice-host"; diff --git a/qse/include/qse/http/httpd.h b/qse/include/qse/http/httpd.h index 8d56b771..20b005fe 100644 --- a/qse/include/qse/http/httpd.h +++ b/qse/include/qse/http/httpd.h @@ -769,11 +769,12 @@ enum qse_httpd_rsrc_proxy_flag_t { QSE_HTTPD_RSRC_PROXY_RAW = (1 << 0), /* raw proxying. set this for CONNECT */ QSE_HTTPD_RSRC_PROXY_TRANSPARENT = (1 << 1), - QSE_HTTPD_RSRC_PROXY_DST_STR = (1 << 2), /* destination is an unresovled string pointed to by dst.str */ - QSE_HTTPD_RSRC_PROXY_ENABLE_DNS = (1 << 3), /* dns service enabled (udp) */ - QSE_HTTPD_RSRC_PROXY_ENABLE_URS = (1 << 4), /* url rewriting enabled (udp) */ - QSE_HTTPD_RSRC_PROXY_DNS_SERVER = (1 << 5), /* dns address specified */ - QSE_HTTPD_RSRC_PROXY_URS_SERVER = (1 << 6), /* urs address specified */ + QSE_HTTPD_RSRC_PROXY_ALLOW_UPGRADE = (1 << 2), + QSE_HTTPD_RSRC_PROXY_DST_STR = (1 << 3), /* destination is an unresovled string pointed to by dst.str */ + QSE_HTTPD_RSRC_PROXY_ENABLE_DNS = (1 << 4), /* dns service enabled (udp) */ + QSE_HTTPD_RSRC_PROXY_ENABLE_URS = (1 << 5), /* url rewriting enabled (udp) */ + QSE_HTTPD_RSRC_PROXY_DNS_SERVER = (1 << 6), /* dns address specified */ + QSE_HTTPD_RSRC_PROXY_URS_SERVER = (1 << 7), /* urs address specified */ }; typedef enum qse_httpd_rsrc_proxy_flag_t qse_httpd_rsrc_proxy_flag_t; @@ -828,7 +829,7 @@ typedef enum qse_httpd_rsrc_reloc_flag_t qse_httpd_rsrc_reloc_flag_t; typedef struct qse_httpd_rsrc_reloc_t qse_httpd_rsrc_reloc_t; struct qse_httpd_rsrc_reloc_t { - int flags; + int flags; /**< 0 or bitwise-ORed of #qse_httpd_rsrc_reloc_flag_t */ const qse_mchar_t* dst; }; @@ -836,7 +837,7 @@ typedef struct qse_httpd_rsrc_t qse_httpd_rsrc_t; struct qse_httpd_rsrc_t { qse_httpd_rsrc_type_t type; - int flags; /**< bitwised-ORed of #qse_httpd_rsrc_flag_t */ + int flags; /**< 0 or bitwise-ORed of #qse_httpd_rsrc_flag_t */ union { struct diff --git a/qse/include/qse/http/stdhttpd.h b/qse/include/qse/http/stdhttpd.h index 2de606e3..1ab19828 100644 --- a/qse/include/qse/http/stdhttpd.h +++ b/qse/include/qse/http/stdhttpd.h @@ -42,6 +42,7 @@ enum qse_httpd_serverstd_root_type_t QSE_HTTPD_SERVERSTD_ROOT_PATH, QSE_HTTPD_SERVERSTD_ROOT_TEXT, QSE_HTTPD_SERVERSTD_ROOT_PROXY, + QSE_HTTPD_SERVERSTD_ROOT_RELOC, QSE_HTTPD_SERVERSTD_ROOT_ERROR }; typedef enum qse_httpd_serverstd_root_type_t qse_httpd_serverstd_root_type_t; @@ -65,6 +66,7 @@ struct qse_httpd_serverstd_root_t } text; qse_httpd_rsrc_proxy_t proxy; + qse_httpd_rsrc_reloc_t reloc; struct { diff --git a/qse/lib/http/httpd-proxy.c b/qse/lib/http/httpd-proxy.c index 140e0d37..802f6b62 100644 --- a/qse/lib/http/httpd-proxy.c +++ b/qse/lib/http/httpd-proxy.c @@ -56,9 +56,10 @@ struct task_proxy_t #define PROXY_X_FORWARDED_FOR (1 << 15) /* X-Forwarded-For: added */ #define PROXY_VIA (1 << 16) /* Via: added to the request */ #define PROXY_VIA_RETURNING (1 << 17) /* Via: added to the response */ -#define PROXY_UPGRADE_REQUESTED (1 << 18) -#define PROXY_PROTOCOL_SWITCHED (1 << 19) -#define PROXY_GOT_BAD_REQUEST (1 << 20) +#define PROXY_ALLOW_UPGRADE (1 << 18) +#define PROXY_UPGRADE_REQUESTED (1 << 19) +#define PROXY_PROTOCOL_SWITCHED (1 << 20) +#define PROXY_GOT_BAD_REQUEST (1 << 21) int flags; qse_httpd_t* httpd; qse_httpd_client_t* client; @@ -977,6 +978,7 @@ static int task_init_proxy ( if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_RAW) proxy->flags |= PROXY_RAW; if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_TRANSPARENT) proxy->flags |= PROXY_TRANSPARENT; + if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_ALLOW_UPGRADE) proxy->flags |= PROXY_ALLOW_UPGRADE; proxy->peer.local = arg->rsrc->src.nwad; if (arg->rsrc->flags & QSE_HTTPD_RSRC_PROXY_DST_STR) @@ -1278,7 +1280,7 @@ qse_mbs_ncat (proxy->reqfwdbuf, spc, QSE_COUNTOF(spc)); snatch_needed = 1; } - if (qse_htre_getheaderval(arg->req, QSE_MT("Upgrade"))) + if ((proxy->flags & PROXY_ALLOW_UPGRADE) && qse_htre_getheaderval(arg->req, QSE_MT("Upgrade"))) { /* Upgrade: is found in the request header */ const qse_htre_hdrval_t* hv; diff --git a/qse/lib/http/httpd-std.c b/qse/lib/http/httpd-std.c index 94e4d583..fc73a9da 100644 --- a/qse/lib/http/httpd-std.c +++ b/qse/lib/http/httpd-std.c @@ -2814,6 +2814,11 @@ static int make_resource ( req->flags |= QSE_HTRE_ATTR_PROXIED; return 0; + case QSE_HTTPD_SERVERSTD_ROOT_RELOC: + target->type = QSE_HTTPD_RSRC_RELOC; + target->u.reloc = tmp.root.u.reloc; + return 0; + case QSE_HTTPD_SERVERSTD_ROOT_ERROR: target->type = QSE_HTTPD_RSRC_ERROR; target->u.error.code = tmp.root.u.error.code;