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/05/11 06:01:19 UTC

[20/32] git commit: Implement LuaRemapReject

Implement LuaRemapReject


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

Branch: refs/heads/jpeach/lua
Commit: 64b9aa533ef05f4766ce971a5e076463a0d4789e
Parents: 41b68e4
Author: James Peach <jp...@apache.org>
Authored: Tue Apr 17 21:38:56 2012 -0700
Committer: James Peach <jp...@apache.org>
Committed: Thu May 10 20:23:42 2012 -0700

----------------------------------------------------------------------
 plugins/lua/lapi.cc |   35 ++++++++++++++++++++++++++++++++++-
 plugins/lua/lapi.h  |    7 ++++---
 plugins/lua/lua.cc  |    5 ++++-
 3 files changed, 42 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/64b9aa53/plugins/lua/lapi.cc
----------------------------------------------------------------------
diff --git a/plugins/lua/lapi.cc b/plugins/lua/lapi.cc
index 2dcc1b2..90eb64d 100644
--- a/plugins/lua/lapi.cc
+++ b/plugins/lua/lapi.cc
@@ -131,6 +131,7 @@ LuaRemapRedirect(lua_State * lua)
   luaL_checktype(lua, 2, LUA_TTABLE);
 
   TSDebug("lua", "redirecting request %p", rq->rri);
+
   lua_pushvalue(lua, 2);
   LuaPopUrl(lua, rq->rri->requestBufp, rq->rri->requestUrl);
   lua_pop(lua, 1);
@@ -153,6 +154,7 @@ LuaRemapRewrite(lua_State * lua)
   luaL_checktype(lua, 2, LUA_TTABLE);
 
   TSDebug("lua", "rewriting request %p", rq->rri);
+
   lua_pushvalue(lua, 2);
   LuaPopUrl(lua, rq->rri->requestBufp, rq->rri->requestUrl);
   lua_pop(lua, 1);
@@ -165,20 +167,51 @@ LuaRemapRewrite(lua_State * lua)
   return 1;
 }
 
+static int
+LuaRemapReject(lua_State * lua)
+{
+  LuaRemapRequest * rq;
+  int status;
+  const char * body = NULL;
+
+  rq = LuaRemapRequest::get(lua, 1);
+  status = luaL_checkint(lua, 2);
+  if (!lua_isnoneornil(lua, 3)) {
+    body = luaL_checkstring(lua, 3);
+  }
+
+  TSDebug("lua", "rejecting request %p with status %d", rq->rri, status);
+
+  TSHttpTxnSetHttpRetStatus(rq->txn, (TSHttpStatus)status);
+  if (body && *body) {
+    // XXX Dubiously guess the content type from the body. This doesn't actually seem to work
+    // so it doesn't matter that our guess is pretty bad.
+    int isplain = (*body != '<');
+    TSHttpTxnSetHttpRetBody(rq->txn, body, isplain);
+  }
+
+  // A reject terminates plugin chain evaluation but does not update the request URL.
+  rq->status = TSREMAP_NO_REMAP_STOP;
+
+  return 1;
+}
+
 static const luaL_Reg RRI[] =
 {
   { "redirect", LuaRemapRedirect },
   { "rewrite", LuaRemapRewrite },
+  { "reject", LuaRemapReject },
   { NULL, NULL}
 };
 
 LuaRemapRequest *
-LuaPushRemapRequestInfo(lua_State * lua, TSRemapRequestInfo * rri)
+LuaPushRemapRequestInfo(lua_State * lua, TSHttpTxn txn, TSRemapRequestInfo * rri)
 {
   LuaRemapRequest * rq;
 
   rq = LuaRemapRequest::alloc(lua);
   rq->rri = rri;
+  rq->txn = txn;
   rq->status = TSREMAP_NO_REMAP;
 
   TSReleaseAssert(lua_isuserdata(lua, -1) == 1);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/64b9aa53/plugins/lua/lapi.h
----------------------------------------------------------------------
diff --git a/plugins/lua/lapi.h b/plugins/lua/lapi.h
index 8ad0495..9dc8534 100644
--- a/plugins/lua/lapi.h
+++ b/plugins/lua/lapi.h
@@ -27,8 +27,9 @@ extern "C" {
 
 struct LuaRemapRequest
 {
-  TSRemapRequestInfo * rri;
-  TSRemapStatus status;
+  TSRemapRequestInfo *  rri;
+  TSHttpTxn             txn;
+  TSRemapStatus         status;
 
   static LuaRemapRequest * get(lua_State * lua, int index);
   static LuaRemapRequest * alloc(lua_State * lua);
@@ -42,6 +43,6 @@ bool LuaPushUrl(lua_State * lua, TSMBuffer buffer, TSMLoc url);
 
 // Push a wrapper object for the given TSRemapRequestInfo.
 LuaRemapRequest *
-LuaPushRemapRequestInfo(lua_State * lua, TSRemapRequestInfo * rri);
+LuaPushRemapRequestInfo(lua_State * lua, TSHttpTxn txn, TSRemapRequestInfo * rri);
 
 #endif // LUA_LAPI_H_

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/64b9aa53/plugins/lua/lua.cc
----------------------------------------------------------------------
diff --git a/plugins/lua/lua.cc b/plugins/lua/lua.cc
index a4d969e..f308524 100644
--- a/plugins/lua/lua.cc
+++ b/plugins/lua/lua.cc
@@ -19,6 +19,7 @@
 #include <ts/ts.h>
 #include <ts/remap.h>
 #include <unistd.h>
+#include <pthread.h>
 #include "lapi.h"
 
 static void *
@@ -88,6 +89,8 @@ LuaPluginRemap(lua_State * lua, TSHttpTxn txn, TSRemapRequestInfo * rri)
     return TSREMAP_NO_REMAP;
   }
 
+  TSDebug("lua", "handling request %p on thread 0x%llx", rri, (unsigned long long)pthread_self());
+
   // XXX The 'to' and 'from' URLs are supposed to be static so we can cache them somewhere
   // in the Lua state.
   LuaPushUrl(lua, rri->requestBufp, rri->mapFromUrl);
@@ -95,7 +98,7 @@ LuaPluginRemap(lua_State * lua, TSHttpTxn txn, TSRemapRequestInfo * rri)
 
   // XXX We can also cache the RemapRequestInfo in the Lua state. We we just need to reset
   // the rri pointer and status.
-  rq = LuaPushRemapRequestInfo(lua, rri);
+  rq = LuaPushRemapRequestInfo(lua, txn, rri);
 
   if (lua_pcall(lua, 3, 0, 0) != 0) {
     TSDebug("lua", "remap failed: %s", lua_tostring(lua, -1));