You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2018/08/08 15:45:36 UTC
[trafficserver] branch 8.0.x updated: Renames
TSHttpTxnSetHttpRetStatus to TSHttpTxnStatusSet
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 8.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/8.0.x by this push:
new 1f8fe8f Renames TSHttpTxnSetHttpRetStatus to TSHttpTxnStatusSet
1f8fe8f is described below
commit 1f8fe8fb8520ec5f618f779d3811bbc6902df338
Author: Leif Hedstrom <zw...@apache.org>
AuthorDate: Mon Aug 6 16:36:06 2018 -0600
Renames TSHttpTxnSetHttpRetStatus to TSHttpTxnStatusSet
This also adds a new API, TSHttpTxnStatusGet(TSHttpTxn txnp),
which is the corresponding Getter for this functionality.
(cherry picked from commit 0570c2945dcf9e0c8ac996c2f854f501d2cf3a35)
---
example/remap/remap.cc | 2 +-
example/secure_link/secure_link.c | 2 +-
lib/cppapi/Transaction.cc | 2 +-
plugins/authproxy/authproxy.cc | 2 +-
plugins/experimental/geoip_acl/geoip_acl.cc | 2 +-
plugins/experimental/hipes/hipes.cc | 22 +++++++++++-----------
.../memcached_remap/memcached_remap.cc | 2 +-
plugins/experimental/mp4/mp4.cc | 2 +-
plugins/experimental/mysql_remap/mysql_remap.cc | 2 +-
plugins/experimental/uri_signing/uri_signing.c | 2 +-
plugins/experimental/url_sig/url_sig.c | 2 +-
plugins/header_rewrite/operators.cc | 6 +++---
plugins/lua/ts_lua_http.c | 4 ++--
plugins/regex_remap/regex_remap.cc | 6 +++---
plugins/s3_auth/s3_auth.cc | 4 ++--
proxy/api/ts/ts.h | 4 ++--
src/traffic_server/InkAPI.cc | 15 ++++++++++++---
tests/tools/plugins/custom204plugin.cc | 2 +-
18 files changed, 46 insertions(+), 37 deletions(-)
diff --git a/example/remap/remap.cc b/example/remap/remap.cc
index 302a261..26aeb86 100644
--- a/example/remap/remap.cc
+++ b/example/remap/remap.cc
@@ -283,7 +283,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
size_t len = snprintf(tmp, 255, "This is very small example of TS API usage!\nIteration %d!\nHTTP return code %d\n",
my_local_counter, TS_HTTP_STATUS_CONTINUE + my_local_counter);
- TSHttpTxnSetHttpRetStatus((TSHttpTxn)rh, (TSHttpStatus)((int)TS_HTTP_STATUS_CONTINUE + my_local_counter));
+ TSHttpTxnStatusSet((TSHttpTxn)rh, (TSHttpStatus)((int)TS_HTTP_STATUS_CONTINUE + my_local_counter));
TSHttpTxnErrorBodySet((TSHttpTxn)rh, tmp, len, nullptr); // Defaults to text/html
my_local_counter++;
}
diff --git a/example/secure_link/secure_link.c b/example/secure_link/secure_link.c
index 7116021..9bf8506 100644
--- a/example/secure_link/secure_link.c
+++ b/example/secure_link/secure_link.c
@@ -126,7 +126,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
}
if (sli->strict) {
TSDebug(PLUGIN_NAME, "request is DENY");
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_FORBIDDEN);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_FORBIDDEN);
i = TSREMAP_NO_REMAP;
} else {
TSDebug(PLUGIN_NAME, "request is PASS");
diff --git a/lib/cppapi/Transaction.cc b/lib/cppapi/Transaction.cc
index afc2019..e4f7c18 100644
--- a/lib/cppapi/Transaction.cc
+++ b/lib/cppapi/Transaction.cc
@@ -200,7 +200,7 @@ void
Transaction::setStatusCode(HttpStatus code)
{
LOG_DEBUG("Transaction tshttptxn=%p setting status code: %d", state_->txn_, code);
- TSHttpTxnSetHttpRetStatus(state_->txn_, static_cast<TSHttpStatus>(code));
+ TSHttpTxnStatusSet(state_->txn_, static_cast<TSHttpStatus>(code));
}
bool
diff --git a/plugins/authproxy/authproxy.cc b/plugins/authproxy/authproxy.cc
index f3f0345..1537398 100644
--- a/plugins/authproxy/authproxy.cc
+++ b/plugins/authproxy/authproxy.cc
@@ -602,7 +602,7 @@ StateUnauthorized(AuthRequestContext *auth, void *)
{
static const char msg[] = "authorization denied\n";
- TSHttpTxnSetHttpRetStatus(auth->txn, TS_HTTP_STATUS_FORBIDDEN);
+ TSHttpTxnStatusSet(auth->txn, TS_HTTP_STATUS_FORBIDDEN);
TSHttpTxnErrorBodySet(auth->txn, TSstrdup(msg), sizeof(msg) - 1, TSstrdup("text/plain"));
TSHttpTxnReenable(auth->txn, TS_EVENT_HTTP_ERROR);
diff --git a/plugins/experimental/geoip_acl/geoip_acl.cc b/plugins/experimental/geoip_acl/geoip_acl.cc
index 07d227c..baa9d9a 100644
--- a/plugins/experimental/geoip_acl/geoip_acl.cc
+++ b/plugins/experimental/geoip_acl/geoip_acl.cc
@@ -106,7 +106,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
if (!a->eval(rri, rh)) {
TSDebug(PLUGIN_NAME, "denying request");
- TSHttpTxnSetHttpRetStatus((TSHttpTxn)rh, (TSHttpStatus)403);
+ TSHttpTxnStatusSet((TSHttpTxn)rh, (TSHttpStatus)403);
a->send_html((TSHttpTxn)rh);
}
}
diff --git a/plugins/experimental/hipes/hipes.cc b/plugins/experimental/hipes/hipes.cc
index a93b9a5..dfcff4e 100644
--- a/plugins/experimental/hipes/hipes.cc
+++ b/plugins/experimental/hipes/hipes.cc
@@ -279,12 +279,12 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
// Make sure we have a matrix parameter, anything without is a bogus request.
if (param_len <= 0) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
return TSREMAP_NO_REMAP;
}
if (param_len > MAX_PATH_SIZE) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
return TSREMAP_NO_REMAP;
}
@@ -305,7 +305,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
len = 8 + h_conf->hipes_server.size() + (param_len - (slash - param) - 1);
}
if (len > MAX_PATH_SIZE) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
return TSREMAP_NO_REMAP;
}
if (h_conf->hipes_port != 80) {
@@ -317,14 +317,14 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
len = escapify_url(svc_url, len, svc_url_esc, MAX_PATH_SIZE);
if (len < 0) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
return TSREMAP_NO_REMAP;
}
TSDebug(PLUGIN_NAME, "Escaped service URL is %s(%d)", svc_url_esc, len);
// Prepare the new query arguments, make sure it fits
if (((slash - param) + 2 + (int)h_conf->url_param.size() + len) > MAX_PATH_SIZE) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
return TSREMAP_NO_REMAP;
}
@@ -400,25 +400,25 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
if (hdr_flag == 2) {
do_redirect = true;
} else {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
has_error = true;
}
break;
default:
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
has_error = true;
break;
}
TSHandleMLocRelease(bufp, hdr_loc, field_loc);
} else {
if (redirect_flag == 2) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
has_error = true;
}
}
TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc);
} else {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
has_error = true;
}
if (has_error) {
@@ -440,7 +440,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
if (len > MAX_REDIRECT_URL) {
TSError("[hipes] Redirect in HIPES URL too long");
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
} else {
int port = -1;
@@ -493,7 +493,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
const char *end = start + redirect_url_size;
rri->redirect = 1;
TSUrlParse(rri->requestBufp, rri->requestUrl, &start, end);
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_MOVED_TEMPORARILY);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_MOVED_TEMPORARILY);
}
} else { // Not a redirect, so proceed normally
// Set timeouts (if requested)
diff --git a/plugins/experimental/memcached_remap/memcached_remap.cc b/plugins/experimental/memcached_remap/memcached_remap.cc
index 336b23a..2cee48e 100644
--- a/plugins/experimental/memcached_remap/memcached_remap.cc
+++ b/plugins/experimental/memcached_remap/memcached_remap.cc
@@ -118,7 +118,7 @@ not_found:
// lets build up a nice 404 message for someone
if (!ret_val) {
TSHttpHdrStatusSet(reqp, hdr_loc, TS_HTTP_STATUS_NOT_FOUND);
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_NOT_FOUND);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_NOT_FOUND);
}
free_stuff:
#if (TS_VERSION_NUMBER < 2001005)
diff --git a/plugins/experimental/mp4/mp4.cc b/plugins/experimental/mp4/mp4.cc
index c62c1fc..f13dc26 100644
--- a/plugins/experimental/mp4/mp4.cc
+++ b/plugins/experimental/mp4/mp4.cc
@@ -106,7 +106,7 @@ TSRemapDoRemap(void * /* ih ATS_UNUSED */, TSHttpTxn rh, TSRemapRequestInfo *rri
return TSREMAP_NO_REMAP;
} else if (start < 0) {
- TSHttpTxnSetHttpRetStatus(rh, TS_HTTP_STATUS_BAD_REQUEST);
+ TSHttpTxnStatusSet(rh, TS_HTTP_STATUS_BAD_REQUEST);
TSHttpTxnErrorBodySet(rh, TSstrdup("Invalid request."), sizeof("Invalid request.") - 1, nullptr);
}
diff --git a/plugins/experimental/mysql_remap/mysql_remap.cc b/plugins/experimental/mysql_remap/mysql_remap.cc
index a8eaee8..5f16598 100644
--- a/plugins/experimental/mysql_remap/mysql_remap.cc
+++ b/plugins/experimental/mysql_remap/mysql_remap.cc
@@ -126,7 +126,7 @@ not_found:
if (!ret_val) {
// lets build up a nice 404 message for someone
TSHttpHdrStatusSet(reqp, hdr_loc, TS_HTTP_STATUS_NOT_FOUND);
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_NOT_FOUND);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_NOT_FOUND);
}
if (res)
mysql_free_result(res);
diff --git a/plugins/experimental/uri_signing/uri_signing.c b/plugins/experimental/uri_signing/uri_signing.c
index f375592..c648d18 100644
--- a/plugins/experimental/uri_signing/uri_signing.c
+++ b/plugins/experimental/uri_signing/uri_signing.c
@@ -267,7 +267,7 @@ fail:
}
PluginDebug("Invalid JWT for %.*s", url_ct, url);
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_FORBIDDEN);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_FORBIDDEN);
PluginDebug("Spent %" PRId64 " ns uri_signing verification of %.*s.", mark_timer(&t), url_ct, url);
if (url != NULL) {
diff --git a/plugins/experimental/url_sig/url_sig.c b/plugins/experimental/url_sig/url_sig.c
index beeb16b..58bbbcd 100644
--- a/plugins/experimental/url_sig/url_sig.c
+++ b/plugins/experimental/url_sig/url_sig.c
@@ -769,7 +769,7 @@ deny:
break;
}
/* Always set the return status */
- TSHttpTxnSetHttpRetStatus(txnp, cfg->err_status);
+ TSHttpTxnStatusSet(txnp, cfg->err_status);
return TSREMAP_DID_REMAP;
diff --git a/plugins/header_rewrite/operators.cc b/plugins/header_rewrite/operators.cc
index 24c7b91..1bfaa9f 100644
--- a/plugins/header_rewrite/operators.cc
+++ b/plugins/header_rewrite/operators.cc
@@ -114,7 +114,7 @@ OperatorSetStatus::exec(const Resources &res) const
}
break;
default:
- TSHttpTxnSetHttpRetStatus(res.txnp, (TSHttpStatus)_status.get_int_value());
+ TSHttpTxnStatusSet(res.txnp, (TSHttpStatus)_status.get_int_value());
break;
}
@@ -415,7 +415,7 @@ OperatorSetRedirect::exec(const Resources &res) const
// Set new location.
TSUrlParse(bufp, url_loc, &start, end);
// Set the new status.
- TSHttpTxnSetHttpRetStatus(res.txnp, (TSHttpStatus)_status.get_int_value());
+ TSHttpTxnStatusSet(res.txnp, (TSHttpStatus)_status.get_int_value());
const_cast<Resources &>(res).changed_url = true;
res._rri->redirect = 1;
} else {
@@ -423,7 +423,7 @@ OperatorSetRedirect::exec(const Resources &res) const
TSHttpStatus status = (TSHttpStatus)_status.get_int_value();
switch (get_hook()) {
case TS_HTTP_PRE_REMAP_HOOK: {
- TSHttpTxnSetHttpRetStatus(res.txnp, status);
+ TSHttpTxnStatusSet(res.txnp, status);
TSCont contp = TSContCreate(cont_add_location, nullptr);
TSContDataSet(contp, const_cast<OperatorSetRedirect *>(this));
TSHttpTxnHookAdd(res.txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp);
diff --git a/plugins/lua/ts_lua_http.c b/plugins/lua/ts_lua_http.c
index 002fa62..e840861 100644
--- a/plugins/lua/ts_lua_http.c
+++ b/plugins/lua/ts_lua_http.c
@@ -283,7 +283,7 @@ ts_lua_http_set_retstatus(lua_State *L)
GET_HTTP_CONTEXT(http_ctx, L);
status = luaL_checkinteger(L, 1);
- TSHttpTxnSetHttpRetStatus(http_ctx->txnp, status);
+ TSHttpTxnStatusSet(http_ctx->txnp, status);
return 0;
}
@@ -314,7 +314,7 @@ ts_lua_http_set_resp(lua_State *L)
n = lua_gettop(L);
status = luaL_checkinteger(L, 1);
- TSHttpTxnSetHttpRetStatus(http_ctx->txnp, status);
+ TSHttpTxnStatusSet(http_ctx->txnp, status);
if (n == 2) {
body = luaL_checklstring(L, 2, &body_len);
diff --git a/plugins/regex_remap/regex_remap.cc b/plugins/regex_remap/regex_remap.cc
index b03405d..920680a 100644
--- a/plugins/regex_remap/regex_remap.cc
+++ b/plugins/regex_remap/regex_remap.cc
@@ -1077,12 +1077,12 @@ TSRemapDoRemap(void *ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
re->status_option() != TS_HTTP_STATUS_TEMPORARY_REDIRECT &&
re->status_option() != TS_HTTP_STATUS_PERMANENT_REDIRECT) {
// Don't set the URL / Location for this.
- TSHttpTxnSetHttpRetStatus(txnp, re->status_option());
+ TSHttpTxnStatusSet(txnp, re->status_option());
break;
}
TSDebug(PLUGIN_NAME, "Redirecting URL, status=%d", re->status_option());
- TSHttpTxnSetHttpRetStatus(txnp, re->status_option());
+ TSHttpTxnStatusSet(txnp, re->status_option());
rri->redirect = 1;
}
@@ -1092,7 +1092,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
// Setup the new URL
if (TS_PARSE_ERROR == TSUrlParse(rri->requestBufp, rri->requestUrl, &start, start + dest_len)) {
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
TSError("[%s] can't parse substituted URL string", PLUGIN_NAME);
}
}
diff --git a/plugins/s3_auth/s3_auth.cc b/plugins/s3_auth/s3_auth.cc
index 3b21bbd..4d65e29 100644
--- a/plugins/s3_auth/s3_auth.cc
+++ b/plugins/s3_auth/s3_auth.cc
@@ -874,7 +874,7 @@ event_handler(TSCont cont, TSEvent event, void *edata)
TSDebug(PLUGIN_NAME, "Succesfully signed the AWS S3 URL");
} else {
TSDebug(PLUGIN_NAME, "Failed to sign the AWS S3 URL, status = %d", status);
- TSHttpTxnSetHttpRetStatus(txnp, status);
+ TSHttpTxnStatusSet(txnp, status);
enable_event = TS_EVENT_HTTP_ERROR;
}
break;
@@ -1028,7 +1028,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn txnp, TSRemapRequestInfo * /* rri */)
} else {
TSDebug(PLUGIN_NAME, "Remap context is invalid");
TSError("[%s] No remap context available, check code / config", PLUGIN_NAME);
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
}
// This plugin actually doesn't do anything with remapping. Ever.
diff --git a/proxy/api/ts/ts.h b/proxy/api/ts/ts.h
index a77155c..3db5637 100644
--- a/proxy/api/ts/ts.h
+++ b/proxy/api/ts/ts.h
@@ -1524,8 +1524,8 @@ tsapi TSReturnCode TSVConnArgIndexReserve(const char *name, const char *descript
tsapi TSReturnCode TSVConnArgIndexNameLookup(const char *name, int *arg_idx, const char **description);
tsapi TSReturnCode TSVConnArgIndexLookup(int arg_idx, const char **name, const char **description);
-/* ToDo: This is a leftover from olden days, can we eliminate? */
-tsapi void TSHttpTxnSetHttpRetStatus(TSHttpTxn txnp, TSHttpStatus http_retstatus);
+tsapi void TSHttpTxnStatusSet(TSHttpTxn txnp, TSHttpStatus status);
+tsapi TSHttpStatus TSHttpTxnStatusGet(TSHttpTxn txnp);
tsapi void TSHttpTxnActiveTimeoutSet(TSHttpTxn txnp, int timeout);
tsapi void TSHttpTxnConnectTimeoutSet(TSHttpTxn txnp, int timeout);
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 4b22185..67ec1a4 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -6004,12 +6004,21 @@ TSVConnArgGet(TSVConn connp, int arg_idx)
}
void
-TSHttpTxnSetHttpRetStatus(TSHttpTxn txnp, TSHttpStatus http_retstatus)
+TSHttpTxnStatusSet(TSHttpTxn txnp, TSHttpStatus status)
{
sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);
- HttpSM *sm = (HttpSM *)txnp;
- sm->t_state.http_return_code = (HTTPStatus)http_retstatus;
+ HttpSM *sm = reinterpret_cast<HttpSM *>(txnp);
+ sm->t_state.http_return_code = static_cast<HTTPStatus>(status);
+}
+
+TSHttpStatus
+TSHttpTxnStatusGet(TSHttpTxn txnp)
+{
+ sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);
+
+ HttpSM *sm = reinterpret_cast<HttpSM *>(txnp);
+ return static_cast<TSHttpStatus>(sm->t_state.http_return_code);
}
/* control channel for HTTP */
diff --git a/tests/tools/plugins/custom204plugin.cc b/tests/tools/plugins/custom204plugin.cc
index 82b2413..c925bb5 100644
--- a/tests/tools/plugins/custom204plugin.cc
+++ b/tests/tools/plugins/custom204plugin.cc
@@ -92,7 +92,7 @@ local_handler(TSCont contp, TSEvent event, void *edata)
break;
case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
TSDebug(PLUGIN_NAME, "Returning 204 with custom response body.");
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_NO_CONTENT);
+ TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_NO_CONTENT);
TSHttpTxnErrorBodySet(txnp, TSstrdup(msg), strlen(msg), TSstrdup("text/html"));
break;