You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2012/06/12 17:51:36 UTC

[17/50] git commit: Implement URL passing for LuaRemapRedirect

Implement URL passing for LuaRemapRedirect


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/58f52156
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/58f52156
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/58f52156

Branch: refs/heads/jpeach/lua
Commit: 58f521566451b4ee31a3d3586304eeb4ad7bcaea
Parents: c55141a
Author: James Peach <jp...@apache.org>
Authored: Mon Apr 16 22:07:24 2012 -0700
Committer: James Peach <jp...@apache.org>
Committed: Tue Jun 12 08:48:36 2012 -0700

----------------------------------------------------------------------
 plugins/lua/lapi.cc |   50 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 47 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/58f52156/plugins/lua/lapi.cc
----------------------------------------------------------------------
diff --git a/plugins/lua/lapi.cc b/plugins/lua/lapi.cc
index dcaa6ae..91350b1 100644
--- a/plugins/lua/lapi.cc
+++ b/plugins/lua/lapi.cc
@@ -35,8 +35,51 @@ LuaRemapRequest::alloc(lua_State * lua)
   luaL_getmetatable(lua, "ts.meta.rri");
   lua_setmetatable(lua, -2);
 
-    return rq;
+  return rq;
+}
+
+// Given a URL table on the top of the stack, pop it's values into the URL buffer.
+bool
+LuaPopUrl(lua_State * lua, TSMBuffer buffer, TSMLoc url)
+{
+  const char *  strval;
+  size_t        len;
+
+#define SET_URL_COMPONENT(name, setter) do { \
+  lua_getfield(lua, -1, name); \
+  if (!lua_isnil(lua, -1)) { \
+    strval = luaL_checklstring(lua, -1, &len); \
+    if (strval) { \
+      setter(buffer, url, strval, len); \
+    } \
+  } \
+  lua_pop(lua, 1); \
+} while (0)
+
+  // We ignore the 'href' field. When constructing URL tables, it's convenient, but it doesn't seem
+  // necessary here. Callers can easily construct the URL table.
+  SET_URL_COMPONENT("scheme", TSUrlSchemeSet);
+  SET_URL_COMPONENT("user", TSUrlUserSet);
+  SET_URL_COMPONENT("password", TSUrlPasswordSet);
+  SET_URL_COMPONENT("host", TSUrlHostSet);
+  SET_URL_COMPONENT("path", TSUrlPathSet);
+  SET_URL_COMPONENT("query", TSUrlHttpQuerySet);
+  SET_URL_COMPONENT("fragment", TSUrlHttpFragmentSet);
+
+  lua_getfield(lua, -1, "port");
+  if (lua_isnil(lua, -1)) {
+    TSDebug("lua", "port is nil?");
+  } else {
+    TSDebug("lua", "port is %d", (int)lua_tointeger(lua, -1));
+    TSUrlPortSet(buffer, url, luaL_checkint(lua, -1));
   }
+  lua_pop(lua, 1);
+
+  TSDebug("lua", "top of stack is %s", luaL_typename(lua, -1));
+
+#undef SET_URL_COMPONENT
+  return true;
+}
 
 bool
 LuaPushUrl(lua_State * lua, TSMBuffer buffer, TSMLoc url)
@@ -93,8 +136,9 @@ LuaRemapRedirect(lua_State * lua)
   luaL_checktype(lua, 2, LUA_TTABLE);
 
   TSDebug("lua", "redirecting request %p", rq->rri);
-
-  // XXX take the URL table argument and use it to rewrite rri->requestUrl ...
+  lua_pushvalue(lua, 2);
+  LuaPopUrl(lua, rq->rri->requestBufp, rq->rri->requestUrl);
+  lua_pop(lua, 1);
 
   // A redirect always terminates plugin chain evaluation.
   rq->rri->redirect = 1;