Repository: trafficserver Updated Branches: refs/heads/master b6383928a -> aadb75226
TS-2838 Add log fields for plugins on HttpSM and use for SPDY. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/aadb7522 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/aadb7522 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/aadb7522 Branch: refs/heads/master Commit: aadb752267ba194a3a6f584c0874cda36e6ab859 Parents: b638392 Author: Alan M. Carroll <[email protected]> Authored: Fri May 23 09:30:03 2014 -0700 Committer: Alan M. Carroll <[email protected]> Committed: Fri May 23 09:30:03 2014 -0700 ---------------------------------------------------------------------- CHANGES | 2 ++ proxy/FetchSM.cc | 17 ++++++------- proxy/FetchSM.h | 4 ++- proxy/InkAPI.cc | 9 ++++++- proxy/Plugin.h | 29 ++++++++++++++++++++++ proxy/PluginVC.cc | 12 ++++++++- proxy/PluginVC.h | 23 ++++++++++++++++- proxy/api/ts/ts.h | 14 +++++++---- proxy/http/HttpClientSession.cc | 8 ++++++ proxy/http/HttpProxyServerMain.cc | 9 +++---- proxy/http/HttpSM.cc | 1 + proxy/http/HttpSM.h | 5 ++++ proxy/logging/Log.cc | 30 +++++++++-------------- proxy/logging/LogAccess.cc | 45 ++++++---------------------------- proxy/logging/LogAccess.h | 3 ++- proxy/logging/LogAccessHttp.cc | 23 ++++++++++++----- proxy/logging/LogAccessHttp.h | 3 ++- proxy/spdy/SpdyClientSession.cc | 36 ++++++++++++++++++++++++--- proxy/spdy/SpdyClientSession.h | 12 ++++++--- proxy/spdy/SpdySessionAccept.cc | 15 +++--------- proxy/spdy/SpdySessionAccept.h | 11 +++------ 21 files changed, 198 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 4f8d8af..fa34b15 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ -*- coding: utf-8 -*- Changes with Apache Traffic Server 5.0.0 + *) [TS-2838] Add logging fields for plugins to TS connect API. Use for SPDY. + *) [TS-2833] Remove REC_BUILD_STAND_ALONE, REC_BUILD_MGMT and REC_BUILD_STUB. Dead code. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/FetchSM.cc ---------------------------------------------------------------------- diff --git a/proxy/FetchSM.cc b/proxy/FetchSM.cc index c119aca..a0a4033 100644 --- a/proxy/FetchSM.cc +++ b/proxy/FetchSM.cc @@ -61,23 +61,22 @@ FetchSM::cleanUp() client_response_hdr.destroy(); ats_free(client_response); cont_mutex.clear(); - - PluginVC *vc = (PluginVC *) http_vc; - - vc->do_io_close(); + http_vc->do_io_close(); FetchSMAllocator.free(this); } void FetchSM::httpConnect() { - Debug(DEBUG_TAG, "[%s] calling httpconnect write", __FUNCTION__); - http_vc = TSHttpConnect(&_addr.sa); + PluginIdentity* pi = dynamic_cast<PluginIdentity*>(contp); + char const* tag = pi ? pi->getPluginTag() : "fetchSM"; + int64_t id = pi ? pi->getPluginId() : 0; - PluginVC *vc = (PluginVC *) http_vc; + Debug(DEBUG_TAG, "[%s] calling httpconnect write", __FUNCTION__); + http_vc = reinterpret_cast<PluginVC*>(TSHttpConnectWithPluginId(&_addr.sa, tag, id)); - read_vio = vc->do_io_read(this, INT64_MAX, resp_buffer); - write_vio = vc->do_io_write(this, getReqLen() + req_content_length, req_reader); + read_vio = http_vc->do_io_read(this, INT64_MAX, resp_buffer); + write_vio = http_vc->do_io_write(this, getReqLen() + req_content_length, req_reader); } char* FetchSM::resp_get(int *length) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/FetchSM.h ---------------------------------------------------------------------- diff --git a/proxy/FetchSM.h b/proxy/FetchSM.h index 0de5d96..c1b94bf 100644 --- a/proxy/FetchSM.h +++ b/proxy/FetchSM.h @@ -35,6 +35,8 @@ #include "HttpSM.h" #include "HttpTunnel.h" +class PluginVC; + class FetchSM: public Continuation { public: @@ -139,7 +141,7 @@ private: int dechunk_body(); int recursion; - TSVConn http_vc; + PluginVC* http_vc; VIO *read_vio; VIO *write_vio; MIOBuffer *req_buffer; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/InkAPI.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index 0182ebe..dceea6e 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -6047,7 +6047,7 @@ extern HttpSessionAccept *plugin_http_accept; extern HttpSessionAccept *plugin_http_transparent_accept; TSVConn -TSHttpConnect(sockaddr const* addr) +TSHttpConnectWithPluginId(sockaddr const* addr, char const* tag, int64_t id) { sdk_assert(addr); @@ -6058,6 +6058,8 @@ TSHttpConnect(sockaddr const* addr) PluginVCCore *new_pvc = PluginVCCore::alloc(); new_pvc->set_active_addr(addr); + new_pvc->set_plugin_id(id); + new_pvc->set_plugin_tag(tag); new_pvc->set_accept_cont(plugin_http_accept); PluginVC *return_vc = new_pvc->connect(); @@ -6076,6 +6078,11 @@ TSHttpConnect(sockaddr const* addr) return NULL; } +TSVConn +TSHttpConnect(sockaddr const* addr) +{ + return TSHttpConnectWithPluginId(addr, "plugin", 0); +} TSVConn TSHttpConnectTransparent(sockaddr const* client_addr, sockaddr const* server_addr) http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/Plugin.h ---------------------------------------------------------------------- diff --git a/proxy/Plugin.h b/proxy/Plugin.h index 4c1ad09..8f70f1a 100644 --- a/proxy/Plugin.h +++ b/proxy/Plugin.h @@ -58,4 +58,33 @@ extern PluginRegInfo *plugin_reg_current; void plugin_init(void); +/** Abstract interface class for plugin based continuations. + + The primary intended use of this is for logging so that continuations + that generate logging messages can generate plugin local data in a + generic way. + + The core will at appropriate times dynamically cast the continuation + to this class and if successful access the plugin data via these + methods. + + Plugins should mix this in to continuations for which it is useful. + The default implementations return empty / invalid responses and should + be overridden by the plugin. + */ +class PluginIdentity +{ + public: + /** Get the plugin tag. + The returned string must have a lifetime at least as long as the plugin. + @return A string identifying the plugin or @c NULL. + */ + virtual char const* getPluginTag() const { return NULL; } + /** Get the plugin instance ID. + A plugin can create multiple subsidiary instances. This is used as the + identifier for those to distinguish the instances. + */ + virtual int64_t getPluginId() const { return 0; } +}; + #endif /* __PLUGIN_H__ */ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/PluginVC.cc ---------------------------------------------------------------------- diff --git a/proxy/PluginVC.cc b/proxy/PluginVC.cc index 2e4cfa1..16eb5a2 100644 --- a/proxy/PluginVC.cc +++ b/proxy/PluginVC.cc @@ -1051,7 +1051,6 @@ void PluginVCCore::set_accept_cont(Continuation * c) { connect_to = c; - // FIX ME - must return action } @@ -1202,6 +1201,17 @@ PluginVCCore::set_transparent(bool passive_side, bool active_side) active_vc.set_is_transparent(active_side); } +void +PluginVCCore::set_plugin_id(int64_t id) +{ + passive_vc.plugin_id = active_vc.plugin_id = id; +} + +void +PluginVCCore::set_plugin_tag(char const* tag) +{ + passive_vc.plugin_tag = active_vc.plugin_tag = tag; +} /************************************************************* * http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/PluginVC.h ---------------------------------------------------------------------- diff --git a/proxy/PluginVC.h b/proxy/PluginVC.h index d770de5..6ee3a93 100644 --- a/proxy/PluginVC.h +++ b/proxy/PluginVC.h @@ -36,6 +36,7 @@ #ifndef _PLUGIN_VC_H_ #define _PLUGIN_VC_H_ +#include "Plugin.h" #include "P_Net.h" #include "ink_atomic.h" @@ -75,7 +76,7 @@ enum PLUGIN_VC_MAGIC_DEAD = 0xaabbdead }; -class PluginVC:public NetVConnection +class PluginVC:public NetVConnection, public PluginIdentity { friend class PluginVCCore; public: @@ -114,6 +115,18 @@ public: virtual PluginVC* get_other_side() { return other_side; } + //@{ @name Plugin identity. + /// Override for @c PluginIdentity. + virtual char const* getPluginTag() const { return plugin_tag; } + /// Override for @c PluginIdentity. + virtual int64_t getPluginId() const { return plugin_id; } + + /// Setter for plugin tag. + virtual void setPluginTag(char const* tag) { plugin_tag = tag; } + /// Setter for plugin id. + virtual void setPluginId(int64_t id) { plugin_id = id; } + //@} + int main_handler(int event, void *data); private: @@ -152,6 +165,9 @@ private: ink_hrtime inactive_timeout; ink_hrtime inactive_timeout_at; Event *inactive_event; + + char const* plugin_tag; + int64_t plugin_id; }; class PluginVCCore:public Continuation @@ -198,6 +214,11 @@ public: void set_transparent(bool passive_side, bool active_side); + /// Set the plugin ID for the internal VCs. + void set_plugin_id(int64_t id); + /// Set the plugin tag for the internal VCs. + void set_plugin_tag(char const* tag); + // The active vc is handed to the initiator of // connection. The passive vc is handled to // receiver of the connection http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/api/ts/ts.h ---------------------------------------------------------------------- diff --git a/proxy/api/ts/ts.h b/proxy/api/ts/ts.h index 27d0546..917d6b2 100644 --- a/proxy/api/ts/ts.h +++ b/proxy/api/ts/ts.h @@ -1588,12 +1588,16 @@ extern "C" than TSNetConnect() to localhost since it avoids the overhead of passing the data through the operating system. - @param log_ip ip address (in network byte order) that connection - will be logged as coming from. - @param log_port port (in network byte order) that connection will - be logged as coming from. - @param vc will be set to point to the new TSVConn on success. + This returns a VConn that connected to the transaction. + + @param addr Target address of the origin server. + @param tag A logging tag that can be accessed via the pitag field. May be @c NULL. + @param id A logging id that can be access via the piid field. + */ + tsapi TSVConn TSHttpConnectWithPluginId(struct sockaddr const* addr, char const* tag, int64_t id); + /** Backwards compatible version. + This provides a @a tag of "plugin" and an @a id of 0. */ tsapi TSVConn TSHttpConnect(struct sockaddr const* addr); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpClientSession.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpClientSession.cc b/proxy/http/HttpClientSession.cc index d2246c8..0620b3b 100644 --- a/proxy/http/HttpClientSession.cc +++ b/proxy/http/HttpClientSession.cc @@ -36,6 +36,7 @@ #include "HttpSM.h" #include "HttpDebugNames.h" #include "HttpServerSession.h" +#include "Plugin.h" #define DebugSsn(tag, ...) DebugSpecific(debug_on, tag, __VA_ARGS__) #define STATE_ENTER(state_name, event, vio) { \ @@ -137,6 +138,7 @@ void HttpClientSession::new_transaction() { ink_assert(current_reader == NULL); + PluginIdentity* pi = dynamic_cast<PluginIdentity*>(client_vc); read_state = HCS_ACTIVE_READER; current_reader = HttpSM::allocate(); @@ -145,6 +147,12 @@ HttpClientSession::new_transaction() DebugSsn("http_cs", "[%" PRId64 "] Starting transaction %d using sm [%" PRId64 "]", con_id, transact_count, current_reader->sm_id); current_reader->attach_client_session(this, sm_reader); + if (pi) { + // it's a plugin VC of some sort with identify information. + // copy it to the SM. + current_reader->plugin_tag = pi->getPluginTag(); + current_reader->plugin_id = pi->getPluginId(); + } } inline void http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpProxyServerMain.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpProxyServerMain.cc b/proxy/http/HttpProxyServerMain.cc index 2bf7d64..9eb9291 100644 --- a/proxy/http/HttpProxyServerMain.cc +++ b/proxy/http/HttpProxyServerMain.cc @@ -180,8 +180,7 @@ MakeHttpProxyAcceptor(HttpProxyAcceptor& acceptor, HttpProxyPort& port, unsigned #if TS_HAS_SPDY if (port.m_session_protocol_preference.intersects(SPDY_PROTOCOL_SET)) { - probe->registerEndpoint(ProtocolProbeSessionAccept::PROTO_SPDY, - new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3_1)); + probe->registerEndpoint(ProtocolProbeSessionAccept::PROTO_SPDY, new SpdySessionAccept(spdy::SESSION_VERSION_3_1)); } #endif @@ -207,11 +206,11 @@ MakeHttpProxyAcceptor(HttpProxyAcceptor& acceptor, HttpProxyPort& port, unsigned // SPDY #if TS_HAS_SPDY if (port.m_session_protocol_preference.contains(TS_NPN_PROTOCOL_INDEX_SPDY_3)) { - ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3, new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3)); + ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3, new SpdySessionAccept(spdy::SESSION_VERSION_3)); } if (port.m_session_protocol_preference.contains(TS_NPN_PROTOCOL_INDEX_SPDY_3_1)) { - ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3_1, new SpdySessionAccept(SpdySessionAccept::SPDY_VERSION_3_1)); + ssl->registerEndpoint(TS_NPN_PROTOCOL_SPDY_3_1, new SpdySessionAccept(spdy::SESSION_VERSION_3_1)); } #endif @@ -316,7 +315,7 @@ start_HttpProxyServerBackDoor(int port, int accept_threads) opt.localhost_only = true; ha_opt.backdoor = true; opt.backdoor = true; - + // The backdoor only binds the loopback interface netProcessor.main_accept(new HttpSessionAccept(ha_opt), NO_FD, opt); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 2eabc1d..02afe4a 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -325,6 +325,7 @@ HttpSM::HttpSM() client_response_hdr_bytes(0), client_response_body_bytes(0), cache_response_hdr_bytes(0), cache_response_body_bytes(0), pushed_response_hdr_bytes(0), pushed_response_body_bytes(0), + plugin_tag(0), plugin_id(0), hooks_set(0), cur_hook_id(TS_HTTP_LAST_HOOK), cur_hook(NULL), cur_hooks(0), callout_state(HTTP_API_NO_CALLOUT), terminate_sm(false), kill_this_async_done(false) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/http/HttpSM.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.h b/proxy/http/HttpSM.h index 2b5a6fd..13121ec 100644 --- a/proxy/http/HttpSM.h +++ b/proxy/http/HttpSM.h @@ -488,6 +488,11 @@ public: int pushed_response_hdr_bytes; int64_t pushed_response_body_bytes; TransactionMilestones milestones; + // The next two enable plugins to tag the state machine for + // the purposes of logging so the instances can be correlated + // with the source plugin. + char const* plugin_tag; + int64_t plugin_id; // hooks_set records whether there are any hooks relevant // to this transaction. Used to avoid costly calls http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/Log.cc ---------------------------------------------------------------------- diff --git a/proxy/logging/Log.cc b/proxy/logging/Log.cc index 16138b4..9ee618e 100644 --- a/proxy/logging/Log.cc +++ b/proxy/logging/Log.cc @@ -365,27 +365,19 @@ Log::init_fields() global_field_list.add (field, false); ink_hash_table_insert (field_symbol_hash, "caun", field); -# if 0 - Ptr<LogFieldAliasTable> proto_type_map = make_ptr(new LogFieldAliasTable); - proto_type_map->init(7, - // Transport protocols - TS_PROTO_UDP, "UDP", - TS_PROTO_TCP, "TCP", - TS_PROTO_TLS, "TLS", - // Application protocols - TS_PROTO_HTTP, "HTTP", - TS_PROTO_SPDY, "SPDY", - TS_PROTO_RTMP, "RTMP", - TS_PROTO_WS, "WS"); - - field = new LogField("client_protocol_stack", "cps", + field = new LogField("plugin_identity_id", "piid", LogField::sINT, - &LogAccess::marshal_client_protocol_stack, - &LogAccess::unmarshal_client_protocol_stack, - (Ptr<LogFieldAliasMap>) proto_type_map); + &LogAccess::marshal_plugin_identity_id, + reinterpret_cast<LogField::UnmarshalFunc>(&LogAccess::unmarshal_int_to_str)); global_field_list.add(field, false); - ink_hash_table_insert(field_symbol_hash, "cps", field); -# endif + ink_hash_table_insert(field_symbol_hash, "piid", field); + + field = new LogField("plugin_identity_tag", "pitag", + LogField::STRING, + &LogAccess::marshal_plugin_identity_tag, + reinterpret_cast<LogField::UnmarshalFunc>(&LogAccess::unmarshal_str)); + global_field_list.add(field, false); + ink_hash_table_insert(field_symbol_hash, "pitag", field); field = new LogField("client_req_timestamp_sec", "cqts", LogField::sINT, http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccess.cc ---------------------------------------------------------------------- diff --git a/proxy/logging/LogAccess.cc b/proxy/logging/LogAccess.cc index 968762e..5009113 100644 --- a/proxy/logging/LogAccess.cc +++ b/proxy/logging/LogAccess.cc @@ -75,12 +75,18 @@ LogAccess::init() -------------------------------------------------------------------------*/ int -LogAccess::marshal_client_protocol_stack(char *buf) +LogAccess::marshal_plugin_identity_id(char *buf) { DEFAULT_INT_FIELD; } int +LogAccess::marshal_plugin_identity_tag(char *buf) +{ + DEFAULT_STR_FIELD; +} + +int LogAccess::marshal_client_host_ip(char *buf) { DEFAULT_IP_FIELD; @@ -1311,43 +1317,6 @@ LogAccess::unmarshal_cache_write_code(char **buf, char *dest, int len, Ptr<LogFi return (LogAccess::unmarshal_with_map(unmarshal_int(buf), dest, len, map, "UNKNOWN_CACHE_WRITE_CODE")); } -# if 0 -int -LogAccess::unmarshal_client_protocol_stack(char **buf, char *dest, int len, Ptr<LogFieldAliasMap> map) -{ - ink_assert(buf != NULL); - ink_assert(*buf != NULL); - ink_assert(dest != NULL); - - char *p; - size_t nr_chars = 0; - int i, ret, nr_bits, left_len; - TSClientProtoStack proto_stack = (TSClientProtoStack)unmarshal_int(buf); - - p = dest; - left_len = len; - nr_bits = 8 * sizeof(TSClientProtoStack); - - for (i = 0; i < nr_bits && left_len; i++) { - if ((proto_stack >> i) & 0x1) { - if (p != dest) { - *p++ = '+'; - left_len--; - } - ret = map->asString(i, p, left_len, &nr_chars); - if (ret == LogFieldAliasMap::ALL_OK) { - p += nr_chars; - left_len -= nr_chars; - } else if (ret == LogFieldAliasMap::BUFFER_TOO_SMALL) { - break; - } - } - } - - return (len - left_len); -} -# endif - int LogAccess::unmarshal_record(char **buf, char *dest, int len) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccess.h ---------------------------------------------------------------------- diff --git a/proxy/logging/LogAccess.h b/proxy/logging/LogAccess.h index 940145d..8fb35b5 100644 --- a/proxy/logging/LogAccess.h +++ b/proxy/logging/LogAccess.h @@ -172,7 +172,6 @@ public: inkcoreapi virtual int marshal_client_auth_user_name(char *); // STR int marshal_client_req_timestamp_sec(char *); // INT - inkcoreapi virtual int marshal_client_protocol_stack(char *); // INT inkcoreapi virtual int marshal_client_req_text(char *); // STR inkcoreapi virtual int marshal_client_req_http_method(char *); // STR inkcoreapi virtual int marshal_client_req_url(char *); // STR @@ -251,6 +250,8 @@ public: inkcoreapi virtual int marshal_transfer_time_ms(char *); // INT inkcoreapi virtual int marshal_transfer_time_s(char *); // INT inkcoreapi virtual int marshal_file_size(char *); // INT + inkcoreapi virtual int marshal_plugin_identity_id(char *); // INT + inkcoreapi virtual int marshal_plugin_identity_tag(char *); // STR int marshal_entry_type(char *); // INT http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccessHttp.cc ---------------------------------------------------------------------- diff --git a/proxy/logging/LogAccessHttp.cc b/proxy/logging/LogAccessHttp.cc index a8dad70..b44e684 100644 --- a/proxy/logging/LogAccessHttp.cc +++ b/proxy/logging/LogAccessHttp.cc @@ -206,16 +206,27 @@ LogAccessHttp::set_client_req_url_path(char *buf, int len) /*------------------------------------------------------------------------- -------------------------------------------------------------------------*/ -# if 0 int -LogAccessHttp::marshal_client_protocol_stack(char *buf) +LogAccessHttp::marshal_plugin_identity_id(char *buf) { - if (buf) { - marshal_int(buf, m_http_sm->proto_stack); - } + if (buf) marshal_int(buf, m_http_sm->plugin_id); return INK_MIN_ALIGN; } -# endif + +int +LogAccessHttp::marshal_plugin_identity_tag(char *buf) +{ + int len = INK_MIN_ALIGN; + char const* tag = m_http_sm->plugin_tag; + + if (!tag) tag = "*"; + else len = LogAccess::strlen(tag); + + if (buf) marshal_str(buf, tag, len); + + return len; +} + int LogAccessHttp::marshal_client_host_ip(char *buf) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/logging/LogAccessHttp.h ---------------------------------------------------------------------- diff --git a/proxy/logging/LogAccessHttp.h b/proxy/logging/LogAccessHttp.h index 53a0ff5..51ee9e3 100644 --- a/proxy/logging/LogAccessHttp.h +++ b/proxy/logging/LogAccessHttp.h @@ -58,7 +58,6 @@ public: virtual int marshal_client_host_ip(char *); // STR virtual int marshal_client_host_port(char *); // INT virtual int marshal_client_auth_user_name(char *); // STR - // virtual int marshal_client_protocol_stack(char *); // INT virtual int marshal_client_req_text(char *); // STR virtual int marshal_client_req_http_method(char *); // INT virtual int marshal_client_req_url(char *); // STR @@ -128,6 +127,8 @@ public: virtual int marshal_transfer_time_ms(char *); // INT virtual int marshal_transfer_time_s(char *); // INT virtual int marshal_file_size(char *); // INT + virtual int marshal_plugin_identity_id(char *); // INT + virtual int marshal_plugin_identity_tag(char *); // STR // // named fields from within a http header http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdyClientSession.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyClientSession.cc b/proxy/spdy/SpdyClientSession.cc index 2c77ff6..fcb79fb 100644 --- a/proxy/spdy/SpdyClientSession.cc +++ b/proxy/spdy/SpdyClientSession.cc @@ -27,6 +27,22 @@ static ClassAllocator<SpdyClientSession> spdyClientSessionAllocator("spdyClientSessionAllocator"); ClassAllocator<SpdyRequest> spdyRequestAllocator("spdyRequestAllocator"); +#if TS_HAS_SPDY +#include "SpdyClientSession.h" + +static const spdylay_proto_version versmap[] = { + SPDYLAY_PROTO_SPDY2, // SPDY_VERSION_2 + SPDYLAY_PROTO_SPDY3, // SPDY_VERSION_3 + SPDYLAY_PROTO_SPDY3_1, // SPDY_VERSION_3_1 +}; + +static char const* const npnmap[] = { + TS_NPN_PROTOCOL_SPDY_2, + TS_NPN_PROTOCOL_SPDY_3, + TS_NPN_PROTOCOL_SPDY_3_1 +}; + +#endif static int spdy_process_read(TSEvent event, SpdyClientSession *sm); static int spdy_process_write(TSEvent event, SpdyClientSession *sm); static int spdy_process_fetch(TSEvent event, SpdyClientSession *sm, void *edata); @@ -69,15 +85,16 @@ SpdyRequest::clear() } void -SpdyClientSession::init(NetVConnection * netvc, spdylay_proto_version vers) +SpdyClientSession::init(NetVConnection * netvc, spdy::SessionVersion vers) { int r; this->mutex = new_ProxyMutex(); this->vc = netvc; this->req_map.clear(); + this->version = vers; - r = spdylay_session_server_new(&session, vers, &SPDY_CFG.spdy.callbacks, this); + r = spdylay_session_server_new(&session, versmap[vers], &SPDY_CFG.spdy.callbacks, this); // A bit ugly but we need a thread and I don't want to wait until the // session start event in case of a time out generating a decrement @@ -157,7 +174,7 @@ SpdyClientSession::clear() } void -spdy_sm_create(NetVConnection * netvc, spdylay_proto_version vers, MIOBuffer * iobuf, IOBufferReader * reader) +spdy_sm_create(NetVConnection * netvc, spdy::SessionVersion vers, MIOBuffer * iobuf, IOBufferReader * reader) { SpdyClientSession *sm; @@ -242,6 +259,19 @@ out: return EVENT_CONT; } +int64_t +SpdyClientSession::getPluginId() const +{ + return sm_id; +} + +char const* +SpdyClientSession::getPluginTag() const +{ + return npnmap[this->version]; +} + + static int spdy_process_read(TSEvent /* event ATS_UNUSED */, SpdyClientSession *sm) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdyClientSession.h ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyClientSession.h b/proxy/spdy/SpdyClientSession.h index 2f37d35..738ff55 100644 --- a/proxy/spdy/SpdyClientSession.h +++ b/proxy/spdy/SpdyClientSession.h @@ -24,9 +24,11 @@ #ifndef __P_SPDY_SM_H__ #define __P_SPDY_SM_H__ +#include "SpdyDefs.h" #include "SpdyCommon.h" #include "SpdyCallbacks.h" #include <openssl/md5.h> +#include "Plugin.h" class SpdyClientSession; typedef int (*SpdyClientSessionHandler) (TSCont contp, TSEvent event, void *data); @@ -89,7 +91,7 @@ public: MD5_CTX recv_md5; }; -class SpdyClientSession : public Continuation +class SpdyClientSession : public Continuation, public PluginIdentity { public: @@ -101,10 +103,11 @@ public: clear(); } - void init(NetVConnection * netvc, spdylay_proto_version vers); + void init(NetVConnection * netvc, spdy::SessionVersion vers); void clear(); int64_t sm_id; + spdy::SessionVersion version; uint64_t total_size; TSHRTime start_time; @@ -124,12 +127,15 @@ public: map<int32_t, SpdyRequest*> req_map; + virtual char const* getPluginTag() const; + virtual int64_t getPluginId() const; + private: int state_session_start(int event, void * edata); int state_session_readwrite(int event, void * edata); }; -void spdy_sm_create(NetVConnection * netvc, spdylay_proto_version vers, MIOBuffer * iobuf, IOBufferReader * reader); +void spdy_sm_create(NetVConnection * netvc, spdy::SessionVersion vers, MIOBuffer * iobuf, IOBufferReader * reader); extern ClassAllocator<SpdyRequest> spdyRequestAllocator; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdySessionAccept.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdySessionAccept.cc b/proxy/spdy/SpdySessionAccept.cc index e679adc..d7dfa11 100644 --- a/proxy/spdy/SpdySessionAccept.cc +++ b/proxy/spdy/SpdySessionAccept.cc @@ -26,20 +26,13 @@ #if TS_HAS_SPDY #include "SpdyClientSession.h" - -static const spdylay_proto_version versmap[] = { - SPDYLAY_PROTO_SPDY2, // SPDY_VERSION_2 - SPDYLAY_PROTO_SPDY3, // SPDY_VERSION_3 - SPDYLAY_PROTO_SPDY3_1, // SPDY_VERSION_3_1 -}; - #endif -SpdySessionAccept::SpdySessionAccept(unsigned vers) +SpdySessionAccept::SpdySessionAccept(spdy::SessionVersion vers) : SessionAccept(new_ProxyMutex()), version(vers) { #if TS_HAS_SPDY - ink_release_assert(vers < countof(versmap)); + ink_release_assert(spdy::SESSION_VERSION_2 <= vers && vers <= spdy::SESSION_VERSION_3_1); #endif SET_HANDLER(&SpdySessionAccept::mainEvent); } @@ -51,7 +44,7 @@ SpdySessionAccept::mainEvent(int event, void * edata) NetVConnection * netvc =static_cast<NetVConnection *>(edata); #if TS_HAS_SPDY - spdy_sm_create(netvc, versmap[this->version], NULL, NULL); + spdy_sm_create(netvc, this->version, NULL, NULL); #else Error("accepted a SPDY session, but SPDY support is not available"); netvc->do_io_close(); @@ -68,7 +61,7 @@ void SpdySessionAccept::accept(NetVConnection * netvc, MIOBuffer * iobuf, IOBufferReader * reader) { #if TS_HAS_SPDY - spdy_sm_create(netvc, versmap[this->version], iobuf, reader); + spdy_sm_create(netvc, this->version, iobuf, reader); #else (void)netvc; (void)iobuf; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/aadb7522/proxy/spdy/SpdySessionAccept.h ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdySessionAccept.h b/proxy/spdy/SpdySessionAccept.h index 9d740e2..af3d81d 100644 --- a/proxy/spdy/SpdySessionAccept.h +++ b/proxy/spdy/SpdySessionAccept.h @@ -28,18 +28,13 @@ #include "P_EventSystem.h" #include "P_UnixNet.h" #include "I_IOBuffer.h" +#include "SpdyDefs.h" class SpdySessionAccept: public SessionAccept { public: - enum { - SPDY_VERSION_2 = 0, - SPDY_VERSION_3, - SPDY_VERSION_3_1, - }; - - explicit SpdySessionAccept(unsigned vers); + explicit SpdySessionAccept(spdy::SessionVersion vers); ~SpdySessionAccept() {} void accept(NetVConnection *, MIOBuffer *, IOBufferReader *); @@ -49,7 +44,7 @@ private: SpdySessionAccept(const SpdySessionAccept &); // disabled SpdySessionAccept& operator =(const SpdySessionAccept&); // disabled - unsigned version; + spdy::SessionVersion version; }; #endif /* SpdySessionAccept_H_ */
