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 2012/03/01 17:04:53 UTC
[6/11] git commit: TS-1122 Support redirects properly
TS-1122 Support redirects properly
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/c39aab2c
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/c39aab2c
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/c39aab2c
Branch: refs/heads/master
Commit: c39aab2ca0814e37f99e1a1c9c3d2cc451f92900
Parents: cb87705
Author: Leif Hedstrom <zw...@apache.org>
Authored: Sun Feb 26 21:02:28 2012 -0700
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Sun Feb 26 21:02:28 2012 -0700
----------------------------------------------------------------------
regex_remap.cc | 40 ++++++++++++++++++++++------------------
1 files changed, 22 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/c39aab2c/regex_remap.cc
----------------------------------------------------------------------
diff --git a/regex_remap.cc b/regex_remap.cc
index d7608fd..786180a 100644
--- a/regex_remap.cc
+++ b/regex_remap.cc
@@ -670,7 +670,7 @@ TSRemapNewInstance(int argc, char* argv[], void** ih, char* errbuf, int errbuf_s
}
if (cur->compile(&error, &erroffset) < 0) {
- TSError("PCRE failed in %s (line %d) at offset %d: %s\n", (ri->filename).c_str(), lineno, erroffset, error);
+ TSError("PCRE failed in %s (line %d) at offset %d: %s", (ri->filename).c_str(), lineno, erroffset, error);
delete(cur);
} else {
TSDebug(PLUGIN_NAME, "added regex=%s with substitution=%s and options `%s'",
@@ -837,40 +837,43 @@ TSRemapDoRemap(void* ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
dest_len = re->substitute(dest, match_buf, ovector, lengths, rri, &req_url, addr);
- TSDebug(PLUGIN_NAME, "New URL is estimated to be %d bytes long, or less\n", new_len);
+ TSDebug(PLUGIN_NAME, "New URL is estimated to be %d bytes long, or less", new_len);
TSDebug(PLUGIN_NAME, "New URL is %s (length %d)", dest, dest_len);
TSDebug(PLUGIN_NAME, " matched rule %d [%s]", re->order(), re->regex());
// Check for a quick response, if the status option is set
-// ToDo: Figure out how we make redirects now from a remap plugin ...
-#if 0
- if (re->status_option() > 0) {
+ if (re->status_option() > 0 &&
+ re->status_option() != TS_HTTP_STATUS_MOVED_PERMANENTLY &&
+ re->status_option() != TS_HTTP_STATUS_MOVED_TEMPORARILY) {
+ // Don't set the URL / Location for this.
TSHttpTxnSetHttpRetStatus(txnp, re->status_option());
- if ((re->status_option() == (TSHttpStatus)301) || (re->status_option() == (TSHttpStatus)302)) {
- if (dest_len > TSREMAP_RRI_MAX_REDIRECT_URL) {
- TSError("Redirect in target URL too long");
- TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
- } else {
- memcpy(rri->redirect_url, dest, dest_len);
- rri->redirect_url_size = dest_len;
- }
- }
- return TSREMAP_DID_REMAP;
+ break;
}
-#endif
if (dest_len > 0) {
+ TSDebug(PLUGIN_NAME, "Redirecting URL, status=%d", re->status_option());
+ TSHttpTxnSetHttpRetStatus(txnp, re->status_option());
+ rri->redirect = 1;
+ } else {
+ TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
+ TSError("redirect to zero-length URL");
+ }
+
+ // Now parse the new URL, which can also be the redirect URL
+ if (dest_len > 0) {
const char *start = dest;
// Setup the new URL
if (TS_PARSE_ERROR == TSUrlParse(rri->requestBufp, rri->requestUrl, &start, start + dest_len)) {
- TSHttpTxnSetHttpRetStatus(txnp, (TSHttpStatus)500);
+ TSHttpTxnSetHttpRetStatus(txnp, TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
TSError("can't parse substituted URL string");
}
}
- break; // We're done
+ break;
}
}
+
+ // Try the next regex
re = re->next();
if (re == NULL) {
retval = TSREMAP_NO_REMAP; // No match
@@ -878,6 +881,7 @@ TSRemapDoRemap(void* ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
atomic_increment(&(ri->misses), 1);
}
}
+
return retval;
}