You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by er...@apache.org on 2010/11/16 18:48:28 UTC

svn commit: r1035710 - in /trafficserver/traffic/trunk/proxy: InkAPI.cc InkAPITest.cc api/ts/ts.h.in http2/HttpDebugNames.cc http2/HttpSM.cc http2/HttpTransact.cc http2/HttpTransact.h

Author: ericb
Date: Tue Nov 16 17:48:27 2010
New Revision: 1035710

URL: http://svn.apache.org/viewvc?rev=1035710&view=rev
Log:
* Rearrange the API hooks per TS-529
* Added new API function for optionally skipping the various remap states within the HttpSM TS-530

 Review: Leif H.

Modified:
    trafficserver/traffic/trunk/proxy/InkAPI.cc
    trafficserver/traffic/trunk/proxy/InkAPITest.cc
    trafficserver/traffic/trunk/proxy/api/ts/ts.h.in
    trafficserver/traffic/trunk/proxy/http2/HttpDebugNames.cc
    trafficserver/traffic/trunk/proxy/http2/HttpSM.cc
    trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc
    trafficserver/traffic/trunk/proxy/http2/HttpTransact.h

Modified: trafficserver/traffic/trunk/proxy/InkAPI.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPI.cc?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPI.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPI.cc Tue Nov 16 17:48:27 2010
@@ -7714,4 +7714,17 @@ INKRecordDump(INKRecordType rec_type, IN
   RecDumpRecords((RecT)rec_type, (RecDumpEntryCb)callback, edata);
 }
 
+/* ability to skip the remap phase of the State Machine 
+   this only really makes sense in INK_HTTP_READ_REQUEST_HDR_HOOK
+*/
+INKReturnCode INKSkipRemappingSet(INKHttpTxn txnp, int flag)
+{
+  if (sdk_sanity_check_txn(txnp) != INK_SUCCESS) {
+    return INK_ERROR;
+  }
+  HttpSM *sm = (HttpSM*) txnp;
+  sm->t_state.api_skip_all_remapping = (flag != 0);
+  return INK_SUCCESS;
+}
+
 #endif //INK_NO_API

Modified: trafficserver/traffic/trunk/proxy/InkAPITest.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPITest.cc?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPITest.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPITest.cc Tue Nov 16 17:48:27 2010
@@ -6559,7 +6559,8 @@ typedef enum
   ORIG_INK_HTTP_SSN_START_HOOK,
   ORIG_INK_HTTP_SSN_CLOSE_HOOK,
   ORIG_INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK,
-  ORIG_INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK,
+  ORIG_INK_HTTP_PRE_REMAP_HOOK,
+  ORIG_INK_HTTP_POST_REMAP_HOOK,
   ORIG_INK_HTTP_LAST_HOOK
 } ORIG_INKHttpHookID;
 

Modified: trafficserver/traffic/trunk/proxy/api/ts/ts.h.in
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/api/ts/ts.h.in?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/api/ts/ts.h.in (original)
+++ trafficserver/traffic/trunk/proxy/api/ts/ts.h.in Tue Nov 16 17:48:27 2010
@@ -233,10 +233,13 @@ extern "C"
     INK_HTTP_SSN_START_HOOK,
     INK_HTTP_SSN_CLOSE_HOOK,
     INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK,
-    INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK,
+    INK_HTTP_PRE_REMAP_HOOK,
+    INK_HTTP_POST_REMAP_HOOK,
     INK_HTTP_LAST_HOOK
   } INKHttpHookID;
-
+  
+  #define INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK INK_HTTP_PRE_REMAP_HOOK //backwards compat
+  
   typedef enum
   {
     INK_CACHE_PLUGIN_HOOK,
@@ -330,7 +333,8 @@ extern "C"
     INK_EVENT_HTTP_SSN_START = 60013,
     INK_EVENT_HTTP_SSN_CLOSE = 60014,
     INK_EVENT_HTTP_CACHE_LOOKUP_COMPLETE = 60015,
-    INK_EVENT_HTTP_READ_REQUEST_PRE_REMAP = 60016,
+    INK_EVENT_HTTP_PRE_REMAP = 60016,
+    INK_EVENT_HTTP_POST_REMAP = 60017,
     INK_EVENT_MGMT_UPDATE = 60100,
 
     /* EVENTS 60200 - 60202 for internal use */
@@ -338,7 +342,9 @@ extern "C"
     INK_EVENT_INTERNAL_60201 = 60201,
     INK_EVENT_INTERNAL_60202 = 60202
   } INKEvent;
-
+  
+  #define INK_EVENT_HTTP_READ_REQUEST_PRE_REMAP INK_EVENT_HTTP_PRE_REMAP //backwards compat
+  
   typedef enum
   { INK_SRVSTATE_STATE_UNDEFINED = 0,
     INK_SRVSTATE_ACTIVE_TIMEOUT,
@@ -2762,7 +2768,15 @@ extern "C"
   inkapi void INKVConnInactivityTimeoutCancel(INKVConn connp);
   inkapi void INKVConnActiveTimeoutSet(INKVConn connp, TSHRTime timeout);
   inkapi void INKVConnActiveTimeoutCancel(INKVConn connp);
-
+  
+   
+  /* 
+    ability to skip the remap phase of the State Machine 
+    this only really makes sense in INK_HTTP_READ_REQUEST_HDR_HOOK
+    
+  */
+  inkapi INKReturnCode INKSkipRemappingSet(INKHttpTxn txnp, int flag);
+  
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: trafficserver/traffic/trunk/proxy/http2/HttpDebugNames.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpDebugNames.cc?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpDebugNames.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpDebugNames.cc Tue Nov 16 17:48:27 2010
@@ -391,10 +391,12 @@ HttpDebugNames::get_action_name(HttpTran
     return ("HTTP_API_SM_SHUTDOWN");
   case HttpTransact::HTTP_REMAP_REQUEST:
     return ("HTTP_REMAP_REQUEST");
-  case HttpTransact::HTTP_API_READ_REQUEST_PRE_REMAP:
-    return ("HTTP_API_READ_REQUEST_PRE_REMAP");
-  case HttpTransact::HTTP_END_REMAP_REQUEST:
-    return ("HTTP_END_REMAP_REQUEST");
+  case HttpTransact::HTTP_API_PRE_REMAP:
+    return ("HTTP_API_PRE_REMAP");
+  case HttpTransact::HTTP_API_POST_REMAP:
+    return ("HTTP_API_POST_REMAP");
+  case HttpTransact::HTTP_POST_REMAP_SKIP:
+    return ("HTTP_POST_REMAP_SKIP");
 
   }
 
@@ -482,8 +484,10 @@ HttpDebugNames::get_api_hook_name(INKHtt
     return "INK_HTTP_SSN_START_HOOK";
   case INK_HTTP_SSN_CLOSE_HOOK:
     return "INK_HTTP_SSN_CLOSE_HOOK";
-  case INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK:
-    return "INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK";
+  case INK_HTTP_PRE_REMAP_HOOK:
+    return "INK_HTTP_PRE_REMAP_HOOK";
+  case INK_HTTP_POST_REMAP_HOOK:
+    return "INK_HTTP_POST_REMAP_HOOK";
   case INK_HTTP_LAST_HOOK:
     return "INK_HTTP_LAST_HOOK";
   }

Modified: trafficserver/traffic/trunk/proxy/http2/HttpSM.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpSM.cc?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpSM.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpSM.cc Tue Nov 16 17:48:27 2010
@@ -1573,7 +1573,8 @@ HttpSM::handle_api_return()
       setup_client_read_request_header();
     }
     return;
-  case HttpTransact::HTTP_API_READ_REQUEST_PRE_REMAP:
+  case HttpTransact::HTTP_API_PRE_REMAP:
+  case HttpTransact::HTTP_API_POST_REMAP:
   case HttpTransact::HTTP_API_READ_REQUEST_HDR:
   case HttpTransact::HTTP_API_OS_DNS:
   case HttpTransact::HTTP_API_READ_CACHE_HDR:
@@ -4416,8 +4417,11 @@ HttpSM::do_api_callout_internal()
   case HttpTransact::HTTP_API_SM_START:
     cur_hook_id = INK_HTTP_TXN_START_HOOK;
     break;
-  case HttpTransact::HTTP_API_READ_REQUEST_PRE_REMAP:
-    cur_hook_id = INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK;
+  case HttpTransact::HTTP_API_PRE_REMAP:
+    cur_hook_id = INK_HTTP_PRE_REMAP_HOOK;
+    break;
+  case HttpTransact::HTTP_API_POST_REMAP:
+    cur_hook_id = INK_HTTP_POST_REMAP_HOOK;
     break;
   case HttpTransact::HTTP_API_READ_REQUEST_HDR:
     cur_hook_id = INK_HTTP_READ_REQUEST_HDR_HOOK;
@@ -6532,8 +6536,9 @@ HttpSM::set_next_state()
   // Use the returned "next action" code to set the next state handler //
   ///////////////////////////////////////////////////////////////////////
   switch (t_state.next_action) {
-  case HttpTransact::HTTP_API_READ_REQUEST_PRE_REMAP:
   case HttpTransact::HTTP_API_READ_REQUEST_HDR:
+  case HttpTransact::HTTP_API_PRE_REMAP:
+  case HttpTransact::HTTP_API_POST_REMAP:
   case HttpTransact::HTTP_API_OS_DNS:
   case HttpTransact::HTTP_API_SEND_REQUEST_HDR:
   case HttpTransact::HTTP_API_READ_CACHE_HDR:
@@ -6545,7 +6550,13 @@ HttpSM::set_next_state()
       do_api_callout();
       break;
     }
-
+  
+  case HttpTransact::HTTP_POST_REMAP_SKIP:
+    {
+      call_transact_and_set_next_state(NULL);
+      break;
+    }
+  
   case HttpTransact::HTTP_REMAP_REQUEST:
     {
       if (!remapProcessor.using_separate_thread()) {
@@ -6558,15 +6569,8 @@ HttpSM::set_next_state()
         do_remap_request(false);        /* dont run inline (iow on another thread) */
       }
       break;
-    }
-
-  case HttpTransact::HTTP_END_REMAP_REQUEST:
-    {
-      /* nop for now */
-      call_transact_and_set_next_state(NULL);
-      break;
-    }
-
+    }  
+  
   case HttpTransact::DNS_LOOKUP:
     {
       if (url_remap_mode == 2 && t_state.first_dns_lookup) {

Modified: trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpTransact.cc Tue Nov 16 17:48:27 2010
@@ -770,9 +770,15 @@ HttpTransact::perform_accept_encoding_fi
 void
 HttpTransact::StartRemapRequest(State * s)
 {
+  
+  if (s->api_skip_all_remapping) {
+    Debug ("http_trans", "API request to skip remapping");
+    TRANSACT_RETURN(HTTP_POST_REMAP_SKIP, HttpTransact::HandleRequest);
+  }
+  
   Debug("http_trans", "START HttpTransact::StartRemapRequest");
 
-        /**
+  /**
 	 * Check for URL remappings before checking request
 	 * validity or initializing state variables since
 	 * the remappings can insert or change the destination
@@ -831,6 +837,12 @@ HttpTransact::StartRemapRequest(State * 
   }
 
   Debug("http_trans", "END HttpTransact::StartRemapRequest");
+  TRANSACT_RETURN(HTTP_API_PRE_REMAP, HttpTransact::PerformRemap);
+}
+
+void HttpTransact::PerformRemap(State *s)
+{
+  Debug("http_trans","Inside PerformRemap");
   TRANSACT_RETURN(HTTP_REMAP_REQUEST, HttpTransact::EndRemapRequest);
 }
 
@@ -844,7 +856,8 @@ HttpTransact::EndRemapRequest(State * s)
   int method = incoming_request->method_get_wksidx();
   int host_len;
   const char *host = incoming_request->host_get(&host_len);
-
+  Debug("http_trans","EndRemapRequest host is %.*s", host_len,host);
+  
   ////////////////////////////////////////////////////////////////
   // if we got back a URL to redirect to, vector the user there //
   ////////////////////////////////////////////////////////////////
@@ -966,13 +979,21 @@ done:
     obj_describe(s->hdr_info.client_request.m_http, 1);
   }
 
-  if (!s->reverse_proxy) {
+  /*
+    if s->reverse_proxy == false, we can assume remapping failed in some way
+      -however-
+    If an API setup a tunnel to fake the origin or proxy's response we will 
+    continue to handle the request (as this was likely the plugin author's intent)
+    
+    otherwise, 502/404 the request right now. /eric
+  */
+  if (!s->reverse_proxy && s->state_machine->plugin_tunnel_type == HTTP_NO_PLUGIN_TUNNEL) {
     Debug("http_trans", "END HttpTransact::EndRemapRequest");
     HTTP_INCREMENT_TRANS_STAT(http_invalid_client_requests_stat);
     TRANSACT_RETURN(PROXY_SEND_ERROR_CACHE_NOOP, NULL);
   } else {
     Debug("http_trans", "END HttpTransact::EndRemapRequest");
-    TRANSACT_RETURN(HTTP_API_READ_REQUEST_HDR, HttpTransact::HandleRequest);
+    TRANSACT_RETURN(HTTP_API_POST_REMAP, HttpTransact::HandleRequest);
   }
 
   ink_debug_assert(!"not reached");
@@ -1092,13 +1113,13 @@ HttpTransact::ModifyRequest(State * s)
 
   Debug("http_trans", "END HttpTransact::ModifyRequest");
 
-  TRANSACT_RETURN(HTTP_API_READ_REQUEST_PRE_REMAP, HttpTransact::StartRemapRequest);
+  TRANSACT_RETURN(HTTP_API_READ_REQUEST_HDR, HttpTransact::StartRemapRequest);
 }
 
 void
 HttpTransact::HandleRequest(State * s)
 {
-  Debug("http_trans", "START HttpTransact/HandleRequest");
+  Debug("http_trans", "START HttpTransact::HandleRequest");
 
   HTTP_DEBUG_ASSERT(!s->hdr_info.server_request.valid());
 
@@ -1299,7 +1320,7 @@ HttpTransact::HandleApiErrorJump(State *
     s->hdr_info.client_response.fields_clear();
     s->source = SOURCE_INTERNAL;
   }
-
+  
   /** 
     The API indicated an error. Lets use a >=400 error from the state (if one's set) or fallback to a 
     generic HTTP/1.X 500 INKApi Error

Modified: trafficserver/traffic/trunk/proxy/http2/HttpTransact.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/HttpTransact.h?rev=1035710&r1=1035709&r2=1035710&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/HttpTransact.h (original)
+++ trafficserver/traffic/trunk/proxy/http2/HttpTransact.h Tue Nov 16 17:48:27 2010
@@ -585,10 +585,13 @@ public:
     CONTINUE,
 
     HTTP_API_SM_START,
-    HTTP_API_READ_REQUEST_PRE_REMAP,
-    HTTP_REMAP_REQUEST,
-    HTTP_END_REMAP_REQUEST,
+    
     HTTP_API_READ_REQUEST_HDR,
+    HTTP_API_PRE_REMAP,
+    HTTP_REMAP_REQUEST,
+    HTTP_API_POST_REMAP,
+    HTTP_POST_REMAP_SKIP,
+    
     HTTP_API_OS_DNS,
     HTTP_API_SEND_REQUEST_HDR,
     HTTP_API_READ_CACHE_HDR,
@@ -1054,7 +1057,8 @@ public:
 
     bool already_downgraded;
     URL pristine_url;  // pristine url is the url before remap
-
+    
+    bool api_skip_all_remapping;
 
     // Methods
     void
@@ -1146,7 +1150,8 @@ public:
         congestion_congested_or_failed(0),
         congestion_connection_opened(0),
         reverse_proxy(false), url_remap_success(false), remap_redirect(NULL), filter_mask(0), already_downgraded(false),
-        pristine_url()
+        pristine_url(),
+        api_skip_all_remapping(false)
     {
       int i;
       char *via_ptr = via_string;
@@ -1259,6 +1264,7 @@ public:
   static void StartRemapRequest(State * s);
   static void RemapRequest(State * s);
   static void EndRemapRequest(State * s);
+  static void PerformRemap(State * s);
   static void ModifyRequest(State * s);
   static void HandleRequest(State * s);
   static bool handleIfRedirect(State * s);