http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_beacon_intercept.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_beacon_intercept.cc b/plugins/experimental/ats_speed/ats_beacon_intercept.cc deleted file mode 100644 index 9b14244..0000000 --- a/plugins/experimental/ats_speed/ats_beacon_intercept.cc +++ /dev/null @@ -1,364 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_beacon_intercept.h" -#include "ats_speed.h" -#include "ats_server_context.h" - -#include "net/instaweb/system/public/system_request_context.h" - -#include <string> -#include <limits.h> -#include <strings.h> -#include <stdio.h> - -using std::string; -using namespace net_instaweb; - -#define DEBUG_TAG "ats_speed_beacon" - -struct InterceptCtx { - TSVConn net_vc; - TSCont contp; - - struct IoHandle { - TSVIO vio; - TSIOBuffer buffer; - TSIOBufferReader reader; - IoHandle() - : vio(0), buffer(0), reader(0) { }; - ~IoHandle() { - if (reader) { - TSIOBufferReaderFree(reader); - } - if (buffer) { - TSIOBufferDestroy(buffer); - } - }; - }; - - IoHandle input; - IoHandle output; - - TSHttpParser http_parser; - string body; - int req_content_len; - TSMBuffer req_hdr_bufp; - TSMLoc req_hdr_loc; - bool req_hdr_parsed; - bool initialized; - TransformCtx* request_context; - InterceptCtx(TSCont cont) - : net_vc(0), contp(cont), input(), output(), body(""), req_content_len(0), req_hdr_bufp(0), req_hdr_loc(0), - req_hdr_parsed(false), initialized(false) { - http_parser = TSHttpParserCreate(); - } - - bool init(TSVConn vconn); - - void setupWrite(); - - ~InterceptCtx() { - TSDebug(DEBUG_TAG, "[%s] Destroying continuation data", __FUNCTION__); - TSHttpParserDestroy(http_parser); - if (req_hdr_loc) { - TSHandleMLocRelease(req_hdr_bufp, TS_NULL_MLOC, req_hdr_loc); - } - if (req_hdr_bufp) { - TSMBufferDestroy(req_hdr_bufp); - } - if (request_context) { - ats_ctx_destroy(request_context); - request_context = NULL; - } - }; -}; - -bool -InterceptCtx::init(TSVConn vconn) -{ - if (initialized) { - TSError("[%s] InterceptCtx already initialized!", __FUNCTION__); - return false; - } - - net_vc = vconn; - - input.buffer = TSIOBufferCreate(); - input.reader = TSIOBufferReaderAlloc(input.buffer); - input.vio = TSVConnRead(net_vc, contp, input.buffer, INT_MAX); - - req_hdr_bufp = TSMBufferCreate(); - req_hdr_loc = TSHttpHdrCreate(req_hdr_bufp); - TSHttpHdrTypeSet(req_hdr_bufp, req_hdr_loc, TS_HTTP_TYPE_REQUEST); - - initialized = true; - TSDebug(DEBUG_TAG, "[%s] InterceptCtx initialized!", __FUNCTION__); - return true; -} - -void -InterceptCtx::setupWrite() { - TSAssert(output.buffer == 0); - output.buffer = TSIOBufferCreate(); - output.reader = TSIOBufferReaderAlloc(output.buffer); - output.vio = TSVConnWrite(net_vc, contp, output.reader, INT_MAX); -} - -// Parses out query params from the request. -void ps_query_params_handler(StringPiece unparsed_uri, StringPiece* data) { - stringpiece_ssize_type question_mark_index = unparsed_uri.find("?"); - if (question_mark_index == StringPiece::npos) { - *data = ""; - } else { - *data = unparsed_uri.substr( - question_mark_index+1, unparsed_uri.size() - (question_mark_index+1)); - } -} - -static bool -handleRead(InterceptCtx *cont_data, bool &read_complete) { - int avail = TSIOBufferReaderAvail(cont_data->input.reader); - if (avail == TS_ERROR) { - TSError("[%s] Error while getting number of bytes available", __FUNCTION__); - return false; - } - - TSDebug(DEBUG_TAG, "[%s] Parsed header, avail: %d", __FUNCTION__, avail); - - int consumed = 0; - if (avail > 0) { - int64_t data_len; - const char *data; - TSIOBufferBlock block = TSIOBufferReaderStart(cont_data->input.reader); - while (block != NULL) { - data = TSIOBufferBlockReadStart(block, cont_data->input.reader, &data_len); - if (!cont_data->req_hdr_parsed) { - const char *endptr = data + data_len; - if (TSHttpHdrParseReq(cont_data->http_parser, cont_data->req_hdr_bufp, cont_data->req_hdr_loc, - &data, endptr) == TS_PARSE_DONE) { - TSDebug(DEBUG_TAG, "[%s] Parsed header", __FUNCTION__); - TSMLoc content_len_loc = TSMimeHdrFieldFind(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, - TS_MIME_FIELD_CONTENT_LENGTH, -1); - - /*if (!content_len_loc) { - TSError("[%s] Error while searching content length header [%s]", - __FUNCTION__, TS_MIME_FIELD_CONTENT_LENGTH); - return false; - } - if (!content_len_loc) { - TSError("[%s] request doesn't contain content length header [%s]", - __FUNCTION__, TS_MIME_FIELD_CONTENT_TYPE); - return false; - }*/ - if (!content_len_loc) { - cont_data->req_content_len = 0; - } else { - cont_data->req_content_len = TSMimeHdrFieldValueIntGet(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, - content_len_loc, 0); - TSHandleMLocRelease(cont_data->req_hdr_bufp, cont_data->req_hdr_loc, content_len_loc); - } - TSDebug(DEBUG_TAG, "[%s] Got content length as %d", __FUNCTION__, cont_data->req_content_len); - if (cont_data->req_content_len < 0) { - TSError("[%s] Invalid content length [%d]", __FUNCTION__, cont_data->req_content_len); - return false; - } - if (endptr - data) { - TSDebug(DEBUG_TAG, "[%s] Appending %ld bytes to body", __FUNCTION__, static_cast<long int>(endptr - data)); - cont_data->body.append(data, endptr - data); - } - cont_data->req_hdr_parsed = true; - } - } else { - //TSDebug(DEBUG_TAG, "[%s] Appending %" PRId64" bytes to body", __FUNCTION__, data_len); - cont_data->body.append(data, data_len); - } - consumed += data_len; - block = TSIOBufferBlockNext(block); - } - } - - TSIOBufferReaderConsume(cont_data->input.reader, consumed); - - TSDebug(DEBUG_TAG, "[%s] Consumed %d bytes from input vio, avail: %d", __FUNCTION__, consumed, avail); - - // Modify the input VIO to reflect how much data we've completed. - TSVIONDoneSet(cont_data->input.vio, TSVIONDoneGet(cont_data->input.vio) + consumed); - - if (static_cast<int>(cont_data->body.size()) == cont_data->req_content_len) { - TSDebug(DEBUG_TAG, "[%s] Completely read body of size %d", __FUNCTION__, cont_data->req_content_len); - read_complete = true; - } else { - read_complete = false; - TSDebug(DEBUG_TAG, "[%s] Reenabling input vio as %ld bytes still need to be read", - __FUNCTION__, static_cast<long int>(cont_data->req_content_len - cont_data->body.size())); - TSVIOReenable(cont_data->input.vio); - } - return true; -} - -static bool -processRequest(InterceptCtx *cont_data) { - // OS: Looks like on 5.x we sometimes receive read complete / EOS events twice, - // which needs looking into. Probably this intercept is doing something it shouldn't - if (cont_data->output.buffer) { - TSDebug("ats_speed", "Received read complete / EOS twice?!"); - return true; - } - string reply_header("HTTP/1.1 204 No Content\r\n"); - int body_size = static_cast<int>(cont_data->body.size()); - if (cont_data->req_content_len != body_size) { - TSError("[%s] Read only %d bytes of body; expecting %d bytes", __FUNCTION__, body_size, - cont_data->req_content_len); - } - - char buf[64]; - //snprintf(buf, 64, "%s: %d\r\n\r\n", TS_MIME_FIELD_CONTENT_LENGTH, body_size); - snprintf(buf, 64, "%s: %d\r\n\r\n", TS_MIME_FIELD_CONTENT_LENGTH, 0); - reply_header.append(buf); - reply_header.append("Cache-Control: max-age=0, no-cache"); - //TSError("[%s] reply header: \n%s", __FUNCTION__, reply_header.data()); - - StringPiece query_param_beacon_data; - ps_query_params_handler(cont_data->request_context->url_string->c_str(), &query_param_beacon_data); - - GoogleString beacon_data = net_instaweb::StrCat( - query_param_beacon_data, "&", cont_data->body); - ServerContext* server_context = cont_data->request_context->server_context; - - SystemRequestContext* system_request_context = - new SystemRequestContext(server_context->thread_system()->NewMutex(), - server_context->timer(), - // TODO(oschaaf): determine these for real. - "www.foo.com", - 80, - "127.0.0.1"); - - if (!server_context->HandleBeacon( - beacon_data, - cont_data->request_context->user_agent->c_str(), - net_instaweb::RequestContextPtr(system_request_context))) { - TSError("Beacon handling failure!"); - } else { - TSDebug(DEBUG_TAG, "Beacon post data processed OK: [%s]", beacon_data.c_str()); - } - - cont_data->setupWrite(); - if (TSIOBufferWrite(cont_data->output.buffer, reply_header.data(), reply_header.size()) == TS_ERROR) { - TSError("[%s] Error while writing reply header", __FUNCTION__); - return false; - } - /* - if (TSIOBufferWrite(cont_data->output.buffer, cont_data->body.data(), body_size) == TS_ERROR) { - TSError("[%s] Error while writing content", __FUNCTION__); - return false; - }*/ - int total_bytes_written = reply_header.size() + body_size; - TSDebug(DEBUG_TAG, "[%s] Wrote reply of size %d", __FUNCTION__, total_bytes_written); - TSVIONBytesSet(cont_data->output.vio, total_bytes_written); - - TSVIOReenable(cont_data->output.vio); - return true; -} - -static int -txn_intercept(TSCont contp, TSEvent event, void *edata) { - TSDebug(DEBUG_TAG, "[%s] Received event: %d", __FUNCTION__, (int)event); - - InterceptCtx *cont_data = static_cast<InterceptCtx *>(TSContDataGet(contp)); - bool read_complete = false; - bool shutdown = false; - switch (event) { - case TS_EVENT_NET_ACCEPT: - TSDebug(DEBUG_TAG, "[%s] Received net accept event", __FUNCTION__); - TSAssert(cont_data->initialized == false); - if (!cont_data->init(static_cast<TSVConn>(edata))) { - TSError("[%s] Could not initialize continuation data!", __FUNCTION__); - return 1; - } - break; - case TS_EVENT_VCONN_READ_READY: - TSDebug(DEBUG_TAG, "[%s] Received read ready event", __FUNCTION__); - if (!handleRead(cont_data, read_complete)) { - TSError("[%s] Error while reading from input vio", __FUNCTION__); - //return 0; - read_complete = true; - } - break; - case TS_EVENT_VCONN_READ_COMPLETE: - case TS_EVENT_VCONN_EOS: - // intentional fall-through - TSDebug(DEBUG_TAG, "[%s] Received read complete/eos event %d", __FUNCTION__, event); - read_complete = true; - break; - case TS_EVENT_VCONN_WRITE_READY: - TSDebug(DEBUG_TAG, "[%s] Received write ready event", __FUNCTION__); - break; - case TS_EVENT_VCONN_WRITE_COMPLETE: - TSDebug(DEBUG_TAG, "[%s] Received write complete event", __FUNCTION__); - shutdown = true; - break; - case TS_EVENT_ERROR: - // todo: do some error handling here - TSDebug(DEBUG_TAG, "[%s] Received error event; going to shutdown, event: %d", __FUNCTION__, event); - TSError("[%s] Received error event; going to shutdown, event: %d", __FUNCTION__, event); - shutdown = true; - break; - default: - break; - } - - if (read_complete) { - if (!processRequest(cont_data)) { - TSError("[%s] Failed to process process", __FUNCTION__); - } else { - TSDebug(DEBUG_TAG, "[%s] Processed request successfully", __FUNCTION__); - } - } - - if (shutdown) { - TSDebug(DEBUG_TAG, "[%s] Completed request processing. Shutting down...", __FUNCTION__); - if (cont_data->net_vc) { - TSVConnClose(cont_data->net_vc); - } - delete cont_data; - TSContDestroy(contp); - } - - return 1; -} - -bool -hook_beacon_intercept(TSHttpTxn txnp) { - TSCont contp = TSContCreate(txn_intercept, TSMutexCreate()); - if (!contp) { - TSError("[%s] Could not create intercept request", __FUNCTION__); - return false; - } - InterceptCtx *cont_data = new InterceptCtx(contp); - cont_data->request_context = get_transaction_context(txnp); - TSContDataSet(contp, cont_data); - TSHttpTxnIntercept(contp, txnp); - TSDebug(DEBUG_TAG, "[%s] Setup server intercept successfully", __FUNCTION__); - return true; -}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_beacon_intercept.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_beacon_intercept.h b/plugins/experimental/ats_speed/ats_beacon_intercept.h deleted file mode 100644 index d53d81c..0000000 --- a/plugins/experimental/ats_speed/ats_beacon_intercept.h +++ /dev/null @@ -1,31 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef _ATS_BEACON_INTERCEPT_H -#define _ATS_BEACON_INTERCEPT_H - -#include "ts/ts.h" - -bool hook_beacon_intercept(TSHttpTxn txnp); - -#endif http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_config.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_config.cc b/plugins/experimental/ats_speed/ats_config.cc deleted file mode 100644 index e0adf42..0000000 --- a/plugins/experimental/ats_speed/ats_config.cc +++ /dev/null @@ -1,204 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_config.h" - -#include <ts/ts.h> -#include <fstream> - -#include "net/instaweb/util/public/string_util.h" - -#include "ats_message_handler.h" -#include "ats_rewrite_options.h" - -namespace net_instaweb { - -using namespace std; - - - -void ltrim_if(string& s, int (* fp) (int)) { - for (size_t i = 0; i < s.size();) { - if (fp(s[i])) { - s.erase(i,1); - } else { - break; - } - } -} - -void rtrim_if(string& s, int (* fp) (int)) { - for (ssize_t i = (ssize_t)s.size() - 1; i >= 0; i--) { - if (fp(s[i])) { - s.erase(i,1); - } else { - break; - } - } -} - -void trim_if(string& s, int (* fp) (int)) { - ltrim_if(s, fp); - rtrim_if(s, fp); -} - -vector<string> tokenize(const string &s, int (* fp) (int)) { - vector<string> r; - string tmp; - - for (size_t i = 0; i < s.size(); i++) { - if ( fp(s[i]) ) { - if ( tmp.size() ) { - r.push_back(tmp); - tmp = ""; - } - } else { - tmp += s[i]; - } - } - - if ( tmp.size() ) { - r.push_back(tmp); - } - - return r; -} - -AtsConfig::AtsConfig(AtsThreadSystem* thread_system) - : thread_system_(thread_system) { - AddHostConfig(new AtsHostConfig(GoogleString("(XXXXXX)"), new AtsRewriteOptions(thread_system_))); -} - -AtsConfig::~AtsConfig() { - for (size_t i = 0; i < host_configurations_.size(); i++) { - delete host_configurations_[i]; - host_configurations_.clear(); - } -} - -void AtsConfig::AddHostConfig(AtsHostConfig* hc){ - host_configurations_.push_back(hc); -} - -AtsHostConfig::~AtsHostConfig() { - if (options_ != NULL) { - delete options_; - options_ = NULL; - } -} - -AtsHostConfig * AtsConfig::Find(const char * host, int host_length) { - AtsHostConfig * host_configuration = host_configurations_[0]; - - std::string shost(host, host_length); - - for (size_t i = 1; i < host_configurations_.size(); i++ ) { - if (host_configurations_[i]->host() == shost){ - host_configuration = host_configurations_[i]; - break; - } - } - - return host_configuration; -} - -bool AtsConfig::Parse(const char * path ) { - string pathstring(path); - - // If we have a path and it's not an absolute path, make it relative to the - // configuration directory. - if (!pathstring.empty() && pathstring[0] != '/') { - pathstring.assign(TSConfigDirGet()); - pathstring.append("/"); - pathstring.append(path); - } - - trim_if(pathstring, isspace); - - AtsHostConfig* current_host_configuration = host_configurations_[0]; - - if (pathstring.empty()) { - TSError("Empty path passed in AtsConfig::Parse"); - return false; - } - - path = pathstring.c_str(); - std::ifstream f; - - size_t lineno = 0; - - f.open(path, std::ios::in); - - if (!f.is_open()) { - TSError("could not open file [%s], skip",path); - return false; - } - - - while (!f.eof()) { - std::string line; - getline(f, line); - ++lineno; - - trim_if(line, isspace); - if (line.size() == 0) { - continue; - } - if (line[0] == '#') { - continue; - } - - vector<string> v = tokenize( line, isspace ); - if (v.size() == 0) - continue; - GoogleString msg; - AtsMessageHandler handler(thread_system_->NewMutex()); - if (v.size() == 1) { - string token = v[0]; - if ((token[0] == '[') && (token[token.size()-1] == ']')) { - GoogleString current_host = token.substr(1, token.size() - 2); - current_host_configuration = new AtsHostConfig(current_host, new AtsRewriteOptions(thread_system_)); - AddHostConfig(current_host_configuration); - } else if (StringCaseEqual(token,"override_expiry")) { - current_host_configuration->set_override_expiry(true); - } else { - msg = "unknown single token on a line"; - } - } else { - global_settings settings; - v.erase (v.begin()); - const char* err = current_host_configuration->options()->ParseAndSetOptions(v, &handler, settings); - if (err) { - msg.append(err); - } - } - if (msg.size() > 0) { - TSDebug("ats-speed", "Error parsing line [%s]: [%s]", line.c_str(), msg.c_str()); - } - } - - return true; -} - - -} // namespace net_instaweb http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_config.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_config.h b/plugins/experimental/ats_speed/ats_config.h deleted file mode 100644 index d3b0e40..0000000 --- a/plugins/experimental/ats_speed/ats_config.h +++ /dev/null @@ -1,90 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_CONFIG_H_ -#define ATS_CONFIG_H_ - -#include <string> -#include <vector> - -#include <ts/ts.h> - -#include "ats_thread_system.h" - -#include "net/instaweb/util/public/string.h" -#include "net/instaweb/util/public/string_util.h" - - -namespace net_instaweb { - -class AtsRewriteOptions; - -class AtsHostConfig { -public: - explicit AtsHostConfig(const GoogleString & host, AtsRewriteOptions* options) - : host_(host) - , options_(options) - { - } - virtual ~AtsHostConfig(); - - inline GoogleString host() { return host_; } - inline AtsRewriteOptions* options() { return options_; } - inline bool override_expiry() { return override_expiry_; } - inline void set_override_expiry(bool x) { override_expiry_ = x; } -private: - GoogleString host_; - AtsRewriteOptions* options_; - bool override_expiry_; - DISALLOW_COPY_AND_ASSIGN(AtsHostConfig); -}; // class AtsHostConfig - -class AtsConfig { - friend class AtsHostConfig; -public: - explicit AtsConfig(AtsThreadSystem* thread_system); - virtual ~AtsConfig(); - - // TODO(oschaaf): destructor?? - bool Parse(const char * path); - AtsHostConfig * Find(const char * host, int host_length); - inline AtsHostConfig * GlobalConfiguration() { - return host_configurations_[0]; - } - AtsThreadSystem* thread_system() { - return thread_system_; - } - -private: - void AddHostConfig(AtsHostConfig* hc); - - std::vector<AtsHostConfig *> host_configurations_; - AtsThreadSystem* thread_system_; - //todo: destructor. delete owned host configurations - DISALLOW_COPY_AND_ASSIGN(AtsConfig); -}; // class Configuration - - -} // namespace net_instaweb - -#endif // ATS_CONFIG_H http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_header_utils.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_header_utils.cc b/plugins/experimental/ats_speed/ats_header_utils.cc deleted file mode 100644 index a61c784..0000000 --- a/plugins/experimental/ats_speed/ats_header_utils.cc +++ /dev/null @@ -1,96 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_header_utils.h" - -GoogleString get_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name) -{ - const char * val = NULL; - int val_len; - TSMLoc field_loc = TSMimeHdrFieldFind( bufp, hdr_loc, header_name, -1); - - if (field_loc) { - val = TSMimeHdrFieldValueStringGet (bufp, hdr_loc, field_loc, 0, &val_len); - TSHandleMLocRelease(bufp,hdr_loc,field_loc); - return GoogleString(val,val_len); - } - - return GoogleString(""); -} - -void unset_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name) -{ - TSMLoc field_loc = TSMimeHdrFieldFind( bufp, hdr_loc, header_name, -1); - - if (field_loc) { - TSMimeHdrFieldDestroy(bufp, hdr_loc, field_loc); - TSHandleMLocRelease(bufp, hdr_loc, field_loc); - } -} - -void hide_accept_encoding(TSMBuffer reqp, TSMLoc hdr_loc, const char * hidden_header_name) -{ - TSMLoc field = TSMimeHdrFieldFind(reqp, hdr_loc, TS_MIME_FIELD_ACCEPT_ENCODING, TS_MIME_LEN_ACCEPT_ENCODING); - while (field) { - TSMLoc tmp; - tmp = TSMimeHdrFieldNextDup(reqp, hdr_loc, field); - TSMimeHdrFieldNameSet(reqp, hdr_loc, field, hidden_header_name, -1); - TSHandleMLocRelease(reqp, hdr_loc, field); - field = tmp; - } -} - -void restore_accept_encoding(TSMBuffer reqp, TSMLoc hdr_loc, const char * hidden_header_name) -{ - TSMLoc field = TSMimeHdrFieldFind(reqp, hdr_loc, hidden_header_name, -1); - - while (field) { - TSMLoc tmp; - tmp = TSMimeHdrFieldNextDup(reqp, hdr_loc, field); - TSMimeHdrFieldNameSet(reqp, hdr_loc, field, TS_MIME_FIELD_ACCEPT_ENCODING, TS_MIME_LEN_ACCEPT_ENCODING); - TSHandleMLocRelease(reqp, hdr_loc, field); - field = tmp; - } -} - -void set_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name, const char * header_value) -{ - TSMLoc field_loc = TSMimeHdrFieldFind( bufp, hdr_loc, header_name, -1); - - if (field_loc) { - TSMimeHdrFieldValueStringSet(bufp, hdr_loc, field_loc, -1, header_value, -1); - } else { - if ( TSMimeHdrFieldCreate(bufp, hdr_loc, &field_loc) == TS_SUCCESS ) { - TSMimeHdrFieldNameSet(bufp, hdr_loc, field_loc, header_name, -1); - TSMimeHdrFieldAppend(bufp, hdr_loc, field_loc); - TSMimeHdrFieldValueStringSet(bufp,hdr_loc,field_loc,-1,header_value,-1); - } else { - TSError("field creation error for field [%s]", header_name); - return; - } - } - - if (field_loc) { - TSHandleMLocRelease(bufp,hdr_loc,field_loc); - } -} http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_header_utils.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_header_utils.h b/plugins/experimental/ats_speed/ats_header_utils.h deleted file mode 100644 index 1d6c567..0000000 --- a/plugins/experimental/ats_speed/ats_header_utils.h +++ /dev/null @@ -1,41 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_HEADER_UTILS_H -#define ATS_HEADER_UTILS_H - -#include <string> - -#include <ts/ts.h> - -#include "net/instaweb/util/public/string.h" -#include "net/instaweb/util/public/string_util.h" - - -GoogleString get_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name); -void unset_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name); -void hide_accept_encoding(TSMBuffer reqp, TSMLoc hdr_loc, const char * hidden_header_name); -void restore_accept_encoding(TSMBuffer reqp, TSMLoc hdr_loc, const char * hidden_header_name); -void set_header(TSMBuffer bufp, TSMLoc hdr_loc, const char * header_name, const char * header_value); - -#endif // ATS_HEADER_UTILS_H http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_log_message_handler.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_log_message_handler.cc b/plugins/experimental/ats_speed/ats_log_message_handler.cc deleted file mode 100644 index f41b9cc..0000000 --- a/plugins/experimental/ats_speed/ats_log_message_handler.cc +++ /dev/null @@ -1,101 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_log_message_handler.h" - -#include <ts/ts.h> - -#include <unistd.h> - -#include <limits> -#include <string> - -#include "base/debug/debugger.h" -#include "base/debug/stack_trace.h" -#include "base/logging.h" -#include "net/instaweb/public/version.h" -#include "net/instaweb/util/public/string_util.h" - -// Make sure we don't attempt to use LOG macros here, since doing so -// would cause us to go into an infinite log loop. -#undef LOG -#define LOG USING_LOG_HERE_WOULD_CAUSE_INFINITE_RECURSION - -namespace { - -bool LogMessageHandler(int severity, const char* file, int line, - size_t message_start, const GoogleString& str) { - GoogleString message = str; - if (severity == logging::LOG_FATAL) { - if (base::debug::BeingDebugged()) { - base::debug::BreakDebugger(); - } else { - base::debug::StackTrace trace; - std::ostringstream stream; - trace.OutputToStream(&stream); - message.append(stream.str()); - } - } - - // Trim the newline off the end of the message string. - size_t last_msg_character_index = message.length() - 1; - if (message[last_msg_character_index] == '\n') { - message.resize(last_msg_character_index); - } - - TSDebug("ats-speed-vlog", "[%s] %s", - net_instaweb::kModPagespeedVersion, - message.c_str()); - - if (severity == logging::LOG_FATAL) { - // Crash the process to generate a dump. - base::debug::BreakDebugger(); - } - - return true; -} - -} // namespace - - -namespace net_instaweb { - -namespace log_message_handler { - - -const int kDebugLogLevel = -2; - -void Install() { - logging::SetLogMessageHandler(&LogMessageHandler); - - // All VLOG(2) and higher will be displayed as DEBUG logs if the nginx log - // level is DEBUG. - // TODO(oschaaf): from config - //if (log->log_level >= NGX_LOG_DEBUG) { - logging::SetMinLogLevel(-2); - //} -} - -} // namespace log_message_handler - -} // namespace net_instaweb http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_log_message_handler.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_log_message_handler.h b/plugins/experimental/ats_speed/ats_log_message_handler.h deleted file mode 100644 index bf57634..0000000 --- a/plugins/experimental/ats_speed/ats_log_message_handler.h +++ /dev/null @@ -1,36 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_LOG_MESSAGE_HANDLER_H_ -#define ATS_LOG_MESSAGE_HANDLER_H_ - - -namespace net_instaweb { - - namespace log_message_handler { - void Install(); - } // namespace log_message_handler - -} // namespace net_instaweb - -#endif // ATS_LOG_MESSAGE_HANDLER_H_ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_message_handler.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_message_handler.cc b/plugins/experimental/ats_speed/ats_message_handler.cc deleted file mode 100644 index 370f317..0000000 --- a/plugins/experimental/ats_speed/ats_message_handler.cc +++ /dev/null @@ -1,114 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_message_handler.h" - -#include <signal.h> -#include <unistd.h> - -#include "net/instaweb/util/public/abstract_mutex.h" -#include "net/instaweb/util/public/debug.h" -#include "net/instaweb/util/public/shared_circular_buffer.h" -#include "net/instaweb/util/public/string_util.h" -#include "net/instaweb/public/version.h" -#include "pagespeed/kernel/base/posix_timer.h" -#include "pagespeed/kernel/base/time_util.h" - - -namespace { - -// This will be prefixed to every logged message. -const char kModuleName[] = "ats_pagespeed"; - -} // namespace - -namespace net_instaweb { - -AtsMessageHandler::AtsMessageHandler(AbstractMutex* mutex) - : mutex_(mutex), - buffer_(NULL) { - SetPidString(static_cast<int64>(getpid())); -} - - -bool AtsMessageHandler::Dump(Writer* writer) { - // Can't dump before SharedCircularBuffer is set up. - if (buffer_ == NULL) { - return false; - } - return buffer_->Dump(writer, &handler_); -} - -void AtsMessageHandler::set_buffer(SharedCircularBuffer* buff) { - ScopedMutex lock(mutex_.get()); - buffer_ = buff; -} - -void AtsMessageHandler::MessageVImpl(MessageType type, const char* msg, - va_list args) { - GoogleString formatted_message = Format(msg, args); - - TSDebug("ats-speed", "[%s %s] %s", kModuleName, kModPagespeedVersion, - formatted_message.c_str()); - - // Prepare a log message for the SharedCircularBuffer only. - // Prepend time and severity to message. - // Format is [time] [severity] [pid] message. - GoogleString message; - GoogleString time; - PosixTimer timer; - if (!ConvertTimeToString(timer.NowMs(), &time)) { - time = "?"; - } - - StrAppend(&message, "[", time, "] ", - "[", MessageTypeToString(type), "] "); - StrAppend(&message, pid_string_, " ", formatted_message, "\n"); - { - ScopedMutex lock(mutex_.get()); - if (buffer_ != NULL) { - buffer_->Write(message); - } - } -} - -void AtsMessageHandler::FileMessageVImpl(MessageType type, const char* file, - int line, const char* msg, - va_list args) { - GoogleString formatted_message = Format(msg, args); - TSDebug("ats-speed", "[%s %s] %s:%d:%s", - kModuleName, kModPagespeedVersion, file, line, - formatted_message.c_str()); -} - -// TODO(sligocki): It'd be nice not to do so much string copying. -GoogleString AtsMessageHandler::Format(const char* msg, va_list args) { - GoogleString buffer; - - // Ignore the name of this routine: it formats with vsnprintf. - // See base/stringprintf.cc. - StringAppendV(&buffer, msg, args); - return buffer; -} - -} // namespace net_instaweb http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_message_handler.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_message_handler.h b/plugins/experimental/ats_speed/ats_message_handler.h deleted file mode 100644 index b8248cf..0000000 --- a/plugins/experimental/ats_speed/ats_message_handler.h +++ /dev/null @@ -1,75 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef NGX_MESSAGE_HANDLER_H_ -#define NGX_MESSAGE_HANDLER_H_ - -#include <ts/ts.h> -#include <cstdarg> - -#include "net/instaweb/util/public/basictypes.h" -#include "net/instaweb/util/public/google_message_handler.h" -#include "net/instaweb/util/public/message_handler.h" -#include "net/instaweb/util/public/scoped_ptr.h" -#include "net/instaweb/util/public/string.h" -#include "net/instaweb/util/public/string_util.h" - -namespace net_instaweb { - - class AbstractMutex; - class SharedCircularBuffer; - class Timer; - class Writer; - - class AtsMessageHandler : public GoogleMessageHandler { - public: - explicit AtsMessageHandler(AbstractMutex* mutex); - - void set_buffer(SharedCircularBuffer* buff); - - void SetPidString(const int64 pid) { - pid_string_ = StrCat("[", Integer64ToString(pid), "]"); - } - // Dump contents of SharedCircularBuffer. - bool Dump(Writer* writer); - - protected: - virtual void MessageVImpl(MessageType type, const char* msg, va_list args); - - virtual void FileMessageVImpl(MessageType type, const char* filename, - int line, const char* msg, va_list args); - - private: - GoogleString Format(const char* msg, va_list args); - - scoped_ptr<AbstractMutex> mutex_; - GoogleString pid_string_; - GoogleMessageHandler handler_; - SharedCircularBuffer* buffer_; - - DISALLOW_COPY_AND_ASSIGN(AtsMessageHandler); - }; - -} // namespace net_instaweb - -#endif // NGX_MESSAGE_HANDLER_H_ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_process_context.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_process_context.cc b/plugins/experimental/ats_speed/ats_process_context.cc deleted file mode 100644 index f3ca481..0000000 --- a/plugins/experimental/ats_speed/ats_process_context.cc +++ /dev/null @@ -1,86 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_process_context.h" - -#include <vector> - -#include "ats_rewrite_driver_factory.h" -#include "ats_server_context.h" -#include "ats_message_handler.h" -#include "ats_thread_system.h" - -#include "net/instaweb/automatic/public/proxy_fetch.h" -#include "net/instaweb/util/public/pthread_shared_mem.h" - -namespace net_instaweb { - - AtsProcessContext::AtsProcessContext() : ProcessContext() { - AtsThreadSystem* ts = new AtsThreadSystem(); - message_handler_.reset(new AtsMessageHandler(ts->NewMutex())); - driver_factory_.reset( - new AtsRewriteDriverFactory( - *this, ts, ""/*hostname, not used*/, -1/*port, not used*/)); - server_context_ = driver_factory()->MakeAtsServerContext(); - - AtsRewriteOptions* root_options_ = (AtsRewriteOptions*)driver_factory_->default_options(); - AtsRewriteOptions* server_options = root_options_->Clone(); - AtsRewriteOptions* options = new AtsRewriteOptions(driver_factory_->thread_system()); - server_options->Merge(*options); - delete options; - - server_context_->global_options()->Merge(*server_options); - delete server_options; - - message_handler_->Message(kInfo,"global default options:\r\n[%s]",driver_factory_->default_options()->OptionsToString().c_str()); - message_handler_->Message(kInfo,"server ctx default options:\r\n[%s]",server_context_->global_options()->OptionsToString().c_str()); - std::vector<SystemServerContext*> server_contexts; - server_contexts.push_back(server_context_); - - //Statistics* statistics = - // driver_factory_->MakeGlobalSharedMemStatistics(*(SystemRewriteOptions*)server_context_->global_options()); - GoogleString error_message; - int error_index = -1; - Statistics* global_statistics = NULL; - driver_factory_.get()->PostConfig( - server_contexts, &error_message, &error_index, &global_statistics); - if (error_index != -1) { - server_contexts[error_index]->message_handler()->Message( - kError, "ngx_pagespeed is enabled. %s", error_message.c_str()); - //return NGX_ERROR; - CHECK(false); - } - - AtsRewriteDriverFactory::InitStats(global_statistics); - - driver_factory()->RootInit(); - driver_factory()->ChildInit(); - - proxy_fetch_factory_.reset(new ProxyFetchFactory(server_context_)); - message_handler_->Message(kInfo, "Process context constructed"); -} - -AtsProcessContext::~AtsProcessContext() { -} - -} // namespace net_instaweb http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_process_context.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_process_context.h b/plugins/experimental/ats_speed/ats_process_context.h deleted file mode 100644 index aa344b2..0000000 --- a/plugins/experimental/ats_speed/ats_process_context.h +++ /dev/null @@ -1,58 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_PROCESS_CONTEXT_H_ -#define ATS_PROCESS_CONTEXT_H_ - -#include "net/instaweb/util/public/google_message_handler.h" -#include "net/instaweb/util/public/message_handler.h" -#include "net/instaweb/util/public/scoped_ptr.h" -#include "net/instaweb/rewriter/public/process_context.h" - -namespace net_instaweb { - -class AtsRewriteDriverFactory; -class ProxyFetchFactory; -class AtsServerContext; - -class AtsProcessContext : ProcessContext { - public: - explicit AtsProcessContext(); - virtual ~AtsProcessContext(); - - // TODO(oschaaf): const correctness - MessageHandler* message_handler() { return message_handler_.get(); } - AtsRewriteDriverFactory* driver_factory() { return driver_factory_.get(); } - ProxyFetchFactory* proxy_fetch_factory() { return proxy_fetch_factory_.get(); } - AtsServerContext* server_context() { return server_context_; } - private: - scoped_ptr<MessageHandler> message_handler_; - scoped_ptr<AtsRewriteDriverFactory> driver_factory_; - scoped_ptr<ProxyFetchFactory> proxy_fetch_factory_; - AtsServerContext* server_context_; -}; - - -} // namespace net_instaweb - -#endif // ATS_PROCESS_CONTEXT_H_ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_resource_intercept.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_resource_intercept.cc b/plugins/experimental/ats_speed/ats_resource_intercept.cc deleted file mode 100644 index 0afeae5..0000000 --- a/plugins/experimental/ats_speed/ats_resource_intercept.cc +++ /dev/null @@ -1,363 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include <ts/ts.h> - -#include <stdio.h> - -#include "ats_resource_intercept.h" - - -#include "ats_base_fetch.h" -#include "ats_rewrite_driver_factory.h" -#include "ats_rewrite_options.h" -#include "ats_server_context.h" -#include "ats_speed.h" - -#include "net/instaweb/http/public/request_context.h" -#include "net/instaweb/rewriter/public/resource_fetch.h" -#include "net/instaweb/rewriter/public/static_asset_manager.h" -#include "net/instaweb/system/public/system_request_context.h" - -#include "net/instaweb/util/public/string_writer.h" - - -using namespace net_instaweb; - -struct InterceptCtx -{ - TSVConn vconn; - TSIOBuffer req_buffer; - TSIOBufferReader req_reader; - TSIOBuffer resp_buffer; - TSIOBufferReader resp_reader; - GoogleString* response; - TransformCtx* request_ctx; - RequestHeaders* request_headers; - - InterceptCtx() - : vconn(NULL) - , req_buffer(NULL) - , req_reader(NULL) - , resp_buffer(NULL) - , resp_reader(NULL) - , response( new GoogleString() ) - , request_ctx(NULL) - , request_headers(NULL) - { - }; -}; - -static void -shutdown (TSCont cont, InterceptCtx * intercept_ctx) { - if (intercept_ctx->req_reader != NULL) { - TSIOBufferReaderFree(intercept_ctx->req_reader); - intercept_ctx->req_reader = NULL; - } - if (intercept_ctx->req_buffer != NULL) { - TSIOBufferDestroy(intercept_ctx->req_buffer); - intercept_ctx->req_buffer = NULL; - } - if (intercept_ctx->resp_reader != NULL) { - TSIOBufferReaderFree(intercept_ctx->resp_reader); - intercept_ctx->resp_reader = NULL; - } - if (intercept_ctx->resp_buffer != NULL) { - TSIOBufferDestroy(intercept_ctx->resp_buffer); - intercept_ctx->resp_buffer = NULL; - } - if (intercept_ctx->vconn != NULL) { - TSVConnShutdown(intercept_ctx->vconn, 0, 1); - TSVConnClose(intercept_ctx->vconn); - intercept_ctx->vconn = NULL; - } - if (intercept_ctx->response != NULL) { - delete intercept_ctx->response; - intercept_ctx->response = NULL; - } - // TODO(oschaaf): think the ordering of this one through. - if (intercept_ctx->request_ctx) { - ats_ctx_destroy(intercept_ctx->request_ctx); - intercept_ctx->request_ctx = NULL; - } - if (intercept_ctx->request_headers != NULL) { - delete intercept_ctx->request_headers; - intercept_ctx->request_headers = NULL; - } - delete intercept_ctx; - TSContDestroy(cont); -} - -static int -resource_intercept(TSCont cont, TSEvent event, void *edata) -{ - InterceptCtx *intercept_ctx = static_cast<InterceptCtx *>(TSContDataGet(cont)); - bool shutDown = false; - - // TODO(oschaaf): have a look at https://github.com/apache/trafficserver/blob/master/plugins/experimental/esi/serverIntercept.c - // and see if we have any edge cases we should fix. - switch (event) { - case TS_EVENT_NET_ACCEPT: { - intercept_ctx->vconn = static_cast<TSVConn>(edata); - intercept_ctx->req_buffer = TSIOBufferCreate(); - intercept_ctx->req_reader = TSIOBufferReaderAlloc(intercept_ctx->req_buffer); - intercept_ctx->resp_buffer = TSIOBufferCreate(); - intercept_ctx->resp_reader = TSIOBufferReaderAlloc(intercept_ctx->resp_buffer); - TSVConnRead(intercept_ctx->vconn, cont, intercept_ctx->req_buffer, 0x7fffffff); - } break; - case TS_EVENT_VCONN_READ_READY: { - CHECK(intercept_ctx->request_ctx->base_fetch == NULL) << "Base fetch must not be set!"; - CHECK(intercept_ctx->request_ctx->url_string != NULL) << "Url must be set!"; - - TSVConnShutdown(intercept_ctx->vconn, 1, 0); - - // response will already have a size for internal pages at this point. - // resources, however, will have to be fetched. - // TODO(oschaaf): this is extremely ugly. - if (intercept_ctx->response->size() == 0) { - // TODO(oschaaf): unused - must we close / clean this up? - TSVIO downstream_vio = TSVConnWrite( - intercept_ctx->vconn, cont, intercept_ctx->resp_reader, 0x7fffffff); - - AtsServerContext* server_context = intercept_ctx->request_ctx->server_context; - - // TODO:(oschaaf) host/port - SystemRequestContext* system_request_context = - new SystemRequestContext(server_context->thread_system()->NewMutex(), - server_context->timer(), - "www.foo.com",// TODO(oschaaf): compute these - 80, - "127.0.0.1"); - - intercept_ctx->request_ctx->base_fetch = new AtsBaseFetch( - server_context, RequestContextPtr(system_request_context), - downstream_vio, intercept_ctx->resp_buffer, true); - intercept_ctx->request_ctx->base_fetch->set_request_headers( - intercept_ctx->request_headers); - - RewriteOptions* options = NULL; - - //const char* host = intercept_ctx->request_headers->Lookup1(HttpAttributes::kHost); - const char* host = intercept_ctx->request_ctx->gurl->HostAndPort().as_string().c_str(); - if (host != NULL && strlen(host) > 0) { - intercept_ctx->request_ctx->options = get_host_options(host); - } - - // TODO(oschaaf): directory options should be coming from configuration! - bool ok = ps_determine_options(server_context, - intercept_ctx->request_ctx->options, - intercept_ctx->request_ctx->base_fetch->request_headers(), - intercept_ctx->request_ctx->base_fetch->response_headers(), - &options, - intercept_ctx->request_ctx->gurl); - - // Take ownership of custom_options. - scoped_ptr<RewriteOptions> custom_options(options); - - if (!ok) { - TSError("Failure while determining request options for psol resource"); - // options = server_context->global_options(); - } else { - // ps_determine_options modified url, removing any ModPagespeedFoo=Bar query - // parameters. Keep url_string in sync with url. - // TODO(oschaaf): we really should determine if we have to do the lookup - intercept_ctx->request_ctx->gurl->Spec().CopyToString(intercept_ctx->request_ctx->url_string); - } - - // The url we have here is already checked for IsWebValid() - net_instaweb::ResourceFetch::Start( - GoogleUrl(*intercept_ctx->request_ctx->url_string), - custom_options.release() /* null if there aren't custom options */, - false /* using_spdy */, server_context, intercept_ctx->request_ctx->base_fetch); - } else { - int64_t numBytesToWrite, numBytesWritten; - numBytesToWrite = intercept_ctx->response->size(); - numBytesWritten = TSIOBufferWrite(intercept_ctx->resp_buffer, - intercept_ctx->response->c_str(), numBytesToWrite); - - if (numBytesWritten == numBytesToWrite) { - TSVConnWrite(intercept_ctx->vconn, cont, intercept_ctx->resp_reader, numBytesToWrite); - } else { - TSError("Not all output could be written in one go"); - DCHECK(false); - } - } - } break; - case TS_EVENT_VCONN_EOS: - TSVConnShutdown(intercept_ctx->vconn, 1, 0); - break; - case TS_EVENT_VCONN_READ_COMPLETE: { - TSVConnShutdown(intercept_ctx->vconn, 1, 0); - } break; - case TS_EVENT_VCONN_WRITE_READY: - break; - case TS_EVENT_VCONN_WRITE_COMPLETE: - shutDown = true; - break; - case TS_EVENT_ERROR: - TSError("vconn event: error %s", intercept_ctx->request_ctx->url_string->c_str()); - shutDown = true; - break; - case TS_EVENT_NET_ACCEPT_FAILED: - TSError("vconn event: accept failed"); - shutDown = true; - break; - case TS_EVENT_IMMEDIATE: - case TS_EVENT_TIMEOUT: - break; - default: - TSError("default clause event: %d", event); - break; - } - - if (shutDown) { - shutdown(cont, intercept_ctx); - } - - return 1; -} - -// We intercept here because serving from ats's own cache is faster -// then serving from pagespeed's cache. (which needs to be looked in to) -static int -read_cache_header_callback(TSCont cont, TSEvent event, void *edata) -{ - TSHttpTxn txn = static_cast<TSHttpTxn>(edata); - TransformCtx* ctx = get_transaction_context(txn); - - if (ctx == NULL) { - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - if (!ctx->resource_request) { - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - // TODO(oschaaf): FIXME: Ownership of ctx has become too mucky. - // This is because I realised too late that the intercepts - // are able to outlive the transaction, which I hacked - // to work. - if (TSHttpIsInternalRequest(txn) == TS_SUCCESS) { - ats_ctx_destroy(ctx); - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - - if (cache_hit(txn)) { - ats_ctx_destroy(ctx); - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - - AtsServerContext* server_context = ctx->server_context; - AtsRewriteDriverFactory* factory = (AtsRewriteDriverFactory*)server_context->factory(); - GoogleString output; - StringWriter writer(&output); - HttpStatus::Code status = HttpStatus::kOK; - ContentType content_type = kContentTypeHtml; - StringPiece cache_control = HttpAttributes::kNoCache; - const char* error_message = NULL; - StringPiece request_uri_path = ctx->gurl->PathAndLeaf(); - - if (false && ctx->gurl->PathSansQuery() == "/robots.txt") { - content_type = kContentTypeText; - writer.Write("User-agent: *\n", server_context->message_handler()); - writer.Write("Disallow: /\n", server_context->message_handler()); - } - - // TODO(oschaaf): /pagespeed_admin handling - else { - // Optimized resource are highly cacheable (1 year expiry) - // TODO(oschaaf): configuration - TSHttpTxnRespCacheableSet(txn, 1); - TSHttpTxnReqCacheableSet(txn, 1); - - TSMBuffer reqp; - TSMLoc req_hdr_loc; - if (TSHttpTxnClientReqGet(ctx->txn, &reqp, &req_hdr_loc) != TS_SUCCESS) { - TSError("Error TSHttpTxnClientReqGet for resource!"); - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - - TSCont interceptCont = TSContCreate(resource_intercept, TSMutexCreate()); - InterceptCtx *intercept_ctx = new InterceptCtx(); - intercept_ctx->request_ctx = ctx; - intercept_ctx->request_headers = new RequestHeaders(); - copy_request_headers_to_psol(reqp, req_hdr_loc, intercept_ctx->request_headers); - TSHandleMLocRelease(reqp, TS_NULL_MLOC, req_hdr_loc); - - - TSContDataSet(interceptCont, intercept_ctx); - TSHttpTxnServerIntercept(interceptCont, txn); - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; - } - - if (error_message != NULL) { - status = HttpStatus::kNotFound; - content_type = kContentTypeHtml; - output = error_message; - } - - ResponseHeaders response_headers; - response_headers.SetStatusAndReason(status); - response_headers.set_major_version(1); - response_headers.set_minor_version(0); - - response_headers.Add(HttpAttributes::kContentType, content_type.mime_type()); - - int64 now_ms = factory->timer()->NowMs(); - response_headers.SetDate(now_ms); - response_headers.SetLastModified(now_ms); - response_headers.Add(HttpAttributes::kCacheControl, cache_control); - - if (FindIgnoreCase(cache_control, "private") == - static_cast<int>(StringPiece::npos)) { - response_headers.Add(HttpAttributes::kEtag, "W/\"0\""); - } - - GoogleString header; - StringWriter header_writer(&header); - response_headers.WriteAsHttp(&header_writer, server_context->message_handler()); - - TSCont interceptCont = TSContCreate(resource_intercept, TSMutexCreate()); - InterceptCtx *intercept_ctx = new InterceptCtx(); - intercept_ctx->request_ctx = ctx; - header.append(output); - TSHttpTxnRespCacheableSet(txn, 0); - TSHttpTxnReqCacheableSet(txn, 0); - TSContDataSet(interceptCont, intercept_ctx); - TSHttpTxnServerIntercept(interceptCont, txn); - intercept_ctx->response->append(header); - - TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); - return 0; -} - -void setup_resource_intercept() -{ - TSCont cont = TSContCreate(read_cache_header_callback, NULL); - TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont); -} - http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_resource_intercept.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_resource_intercept.h b/plugins/experimental/ats_speed/ats_resource_intercept.h deleted file mode 100644 index 933f20f..0000000 --- a/plugins/experimental/ats_speed/ats_resource_intercept.h +++ /dev/null @@ -1,29 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_RESOURCE_INTERCEPT_H -#define ATS_RESOURCE_INTERCEPT_H - -void setup_resource_intercept(); - -#endif // ATS_INTERCEPT_H http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_rewrite_driver_factory.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_rewrite_driver_factory.cc b/plugins/experimental/ats_speed/ats_rewrite_driver_factory.cc deleted file mode 100644 index cf73ed3..0000000 --- a/plugins/experimental/ats_speed/ats_rewrite_driver_factory.cc +++ /dev/null @@ -1,196 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_rewrite_driver_factory.h" - -#include <cstdio> -#include <vector> - -#include "ats_thread_system.h" -#include "ats_message_handler.h" -#include "ats_server_context.h" - -#include "net/instaweb/http/public/content_type.h" -#include "net/instaweb/http/public/rate_controller.h" -#include "net/instaweb/http/public/rate_controlling_url_async_fetcher.h" -#include "net/instaweb/http/public/wget_url_fetcher.h" -#include "net/instaweb/rewriter/public/rewrite_driver.h" -#include "net/instaweb/rewriter/public/rewrite_driver_factory.h" -#include "net/instaweb/rewriter/public/server_context.h" -#include "net/instaweb/rewriter/public/static_asset_manager.h" -#include "net/instaweb/system/public/in_place_resource_recorder.h" -#include "net/instaweb/system/public/serf_url_async_fetcher.h" -#include "net/instaweb/system/public/system_caches.h" -#include "net/instaweb/system/public/system_rewrite_options.h" -#include "net/instaweb/util/public/google_message_handler.h" -#include "net/instaweb/util/public/null_shared_mem.h" -#include "net/instaweb/util/public/posix_timer.h" -#include "net/instaweb/util/public/property_cache.h" -#include "net/instaweb/util/public/pthread_shared_mem.h" -#include "net/instaweb/util/public/scheduler_thread.h" -#include "net/instaweb/util/public/shared_circular_buffer.h" -#include "net/instaweb/util/public/shared_mem_statistics.h" -#include "net/instaweb/util/public/slow_worker.h" -#include "net/instaweb/util/public/stdio_file_system.h" -#include "net/instaweb/util/public/string.h" -#include "net/instaweb/util/public/string_util.h" -#include "net/instaweb/util/public/thread_system.h" - - -namespace net_instaweb { - - - AtsRewriteDriverFactory::AtsRewriteDriverFactory( - const ProcessContext& process_context, - AtsThreadSystem* thread_system, - StringPiece hostname, int port) - : SystemRewriteDriverFactory(process_context, - thread_system, NULL /*default shared mem runtime*/, - "" /*hostname, not used*/, -1/*port, not used*/) - , ats_message_handler_(new AtsMessageHandler(thread_system->NewMutex())) - , ats_html_parse_message_handler_(new AtsMessageHandler(thread_system->NewMutex())) - , use_per_vhost_statistics_(false) - , threads_started_(false) - { - InitializeDefaultOptions(); - default_options()->set_beacon_url("/ats_speed_beacon"); - default_options()->set_enabled(RewriteOptions::kEnabledOn); - default_options()->SetRewriteLevel(RewriteOptions::kCoreFilters); - - SystemRewriteOptions* system_options = dynamic_cast<SystemRewriteOptions*>( - default_options()); - system_options->set_log_dir("/tmp/ps_log/"); - system_options->set_statistics_logging_enabled(true); - - system_options->set_file_cache_clean_inode_limit(500000); - system_options->set_file_cache_clean_size_kb(1024*10000);// 10 GB - system_options->set_avoid_renaming_introspective_javascript(true); - system_options->set_file_cache_path("/tmp/ats_ps/"); - system_options->set_lru_cache_byte_limit(163840); - system_options->set_lru_cache_kb_per_process(1024*500);//500 MB - - system_options->set_flush_html(true); - - AtsRewriteOptions* ats_options = (AtsRewriteOptions*)system_options; - std::vector<std::string> args; - args.push_back("RateLimitBackgroundFetches"); - args.push_back("on"); - global_settings settings; - const char* msg = ats_options->ParseAndSetOptions(args, ats_message_handler_, settings); - CHECK(!msg); - - set_message_buffer_size(1024*128); - set_message_handler(ats_message_handler_); - set_html_parse_message_handler(ats_html_parse_message_handler_); - StartThreads(); - } - - AtsRewriteDriverFactory::~AtsRewriteDriverFactory() { - ShutDown(); - delete ats_message_handler_; - ats_message_handler_ = NULL; - delete ats_html_parse_message_handler_; - ats_html_parse_message_handler_ = NULL; - STLDeleteElements(&uninitialized_server_contexts_); - } - - void AtsRewriteDriverFactory::InitStaticAssetManager(StaticAssetManager* static_js_manager) { - static_js_manager->set_library_url_prefix("/ats_speed_static/"); - } - - Hasher* AtsRewriteDriverFactory::NewHasher() { - return new MD5Hasher; - } - - MessageHandler* AtsRewriteDriverFactory::DefaultHtmlParseMessageHandler() { - return ats_html_parse_message_handler_; - } - - MessageHandler* AtsRewriteDriverFactory::DefaultMessageHandler() { - return ats_message_handler_; - } - - FileSystem* AtsRewriteDriverFactory::DefaultFileSystem() { - return new StdioFileSystem(); - } - - Timer* AtsRewriteDriverFactory::DefaultTimer() { - return new PosixTimer; - } - - NamedLockManager* AtsRewriteDriverFactory::DefaultLockManager() { - CHECK(false) << "default lock manager should not be called"; - return NULL; - } - - RewriteOptions* AtsRewriteDriverFactory::NewRewriteOptions() { - AtsRewriteOptions* options = new AtsRewriteOptions(thread_system()); - options->SetRewriteLevel(RewriteOptions::kCoreFilters); - return options; - } - - ServerContext* AtsRewriteDriverFactory::NewDecodingServerContext() { - ServerContext* sc = new AtsServerContext(this); - InitStubDecodingServerContext(sc); - return sc; - } - - void AtsRewriteDriverFactory::InitStats(Statistics* statistics) { - // Init standard PSOL stats. - SystemRewriteDriverFactory::InitStats(statistics); - // Init Ats-specific stats. - AtsServerContext::InitStats(statistics); - } - - - AtsServerContext* AtsRewriteDriverFactory::MakeAtsServerContext() { - AtsServerContext* server_context = new AtsServerContext(this); - uninitialized_server_contexts_.insert(server_context); - return server_context; - } - - ServerContext* AtsRewriteDriverFactory::NewServerContext() { - LOG(DFATAL) << "MakeAtsServerContext should be used instead"; - return NULL; - } - -net_instaweb::QueuedWorkerPool* AtsRewriteDriverFactory::CreateWorkerPool(net_instaweb::RewriteDriverFactory::WorkerPoolCategory pool, - StringPiece name) { - int tc = 8; - TSDebug("ats_speed", "Created new QueuedWorkerPool of type %d named '%s' of size %d", pool, name.data(), tc); - net_instaweb::QueuedWorkerPool *q_pool = new net_instaweb::QueuedWorkerPool(tc, name, thread_system()); - return q_pool; -} - -void AtsRewriteDriverFactory::StartThreads() { - if (threads_started_) { - CHECK(false) << "threads already started"; - } - SchedulerThread* thread = new SchedulerThread(thread_system(), scheduler()); - bool ok = thread->Start(); - CHECK(ok) << "Unable to start scheduler thread"; - defer_cleanup(thread->MakeDeleter()); - threads_started_ = true; -} - -} // namespace net_instaweb http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_rewrite_driver_factory.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_rewrite_driver_factory.h b/plugins/experimental/ats_speed/ats_rewrite_driver_factory.h deleted file mode 100644 index de18a28..0000000 --- a/plugins/experimental/ats_speed/ats_rewrite_driver_factory.h +++ /dev/null @@ -1,113 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_REWRITE_DRIVER_FACTORY_H_ -#define ATS_REWRITE_DRIVER_FACTORY_H_ - -#include <set> - -#include "net/instaweb/system/public/system_rewrite_driver_factory.h" -#include "net/instaweb/util/public/md5_hasher.h" -#include "net/instaweb/util/public/scoped_ptr.h" - - -namespace net_instaweb { - - - class AbstractSharedMem; - //class NgxMessageHandler; - //class NgxRewriteOptions; - class AtsServerContext; - class AtsThreadSystem; - class GoogleMessageHandler; - //class NgxUrlAsyncFetcher; - class SharedCircularBuffer; - class SharedMemRefererStatistics; - class SharedMemStatistics; - class SlowWorker; - class StaticAssetManager; - class Statistics; - class StaticAssetManager; - //class SystemCaches; - -class AtsRewriteDriverFactory : public SystemRewriteDriverFactory { - public: - explicit AtsRewriteDriverFactory(const ProcessContext& process_context, - AtsThreadSystem* thread_system, - StringPiece hostname, int port); - virtual ~AtsRewriteDriverFactory(); - - virtual Hasher* NewHasher(); - virtual MessageHandler* DefaultHtmlParseMessageHandler(); - virtual MessageHandler* DefaultMessageHandler(); - virtual FileSystem* DefaultFileSystem(); - virtual Timer* DefaultTimer(); - virtual NamedLockManager* DefaultLockManager(); - virtual RewriteOptions* NewRewriteOptions(); - virtual ServerContext* NewDecodingServerContext(); - - virtual bool UseBeaconResultsInFilters() const { - return true; - } - - virtual void InitStaticAssetManager(StaticAssetManager* static_js_manager); - - // Initializes all the statistics objects created transitively by - // AtsRewriteDriverFactory, including nginx-specific and - // platform-independent statistics. - static void InitStats(Statistics* statistics); - - virtual net_instaweb::QueuedWorkerPool* CreateWorkerPool(WorkerPoolCategory pool, - StringPiece name); - virtual void NonStaticInitStats(Statistics* statistics) { - InitStats(statistics); - } - - AtsServerContext* MakeAtsServerContext(); - ServerContext* NewServerContext(); - //AbstractSharedMem* shared_mem_runtime() const { - // return shared_mem_runtime_.get(); - //} - - // Starts pagespeed threads if they've not been started already. Must be - // called after the caller has finished any forking it intends to do. - void StartThreads(); - bool use_per_vhost_statistics() const { - return use_per_vhost_statistics_; - } - void set_use_per_vhost_statistics(bool x) { - use_per_vhost_statistics_ = x; - } - - protected: - private: - //scoped_ptr<AbstractSharedMem> shared_mem_runtime_; - GoogleMessageHandler* ats_message_handler_; - GoogleMessageHandler* ats_html_parse_message_handler_; - bool use_per_vhost_statistics_; - bool threads_started_; -}; - -} // namespace net_instaweb - -#endif // ATS_REWRITE_DRIVER_FACTORY_H_ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_rewrite_options.cc ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_rewrite_options.cc b/plugins/experimental/ats_speed/ats_rewrite_options.cc deleted file mode 100644 index 172db83..0000000 --- a/plugins/experimental/ats_speed/ats_rewrite_options.cc +++ /dev/null @@ -1,263 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "ats_rewrite_options.h" - -#include "net/instaweb/public/version.h" -#include "net/instaweb/rewriter/public/rewrite_options.h" -#include "net/instaweb/util/public/timer.h" - -#include "net/instaweb/util/public/message_handler.h" -#include "net/instaweb/rewriter/public/file_load_policy.h" - -#include "net/instaweb/util/public/stdio_file_system.h" - -#include "ats_message_handler.h" -#include "ats_rewrite_driver_factory.h" - -using namespace std; - -namespace net_instaweb { - - -RewriteOptions::Properties* AtsRewriteOptions::ats_properties_ = NULL; - -AtsRewriteOptions::AtsRewriteOptions(ThreadSystem* thread_system) - : SystemRewriteOptions(thread_system) { - - Init(); -} - -void AtsRewriteOptions::Init() { - DCHECK(ats_properties_ != NULL) - << "Call AtsRewriteOptions::Initialize() before construction"; - InitializeOptions(ats_properties_); -} - -void AtsRewriteOptions::AddProperties() { - MergeSubclassProperties(ats_properties_); - AtsRewriteOptions dummy_config(NULL); - - dummy_config.set_default_x_header_value(MOD_PAGESPEED_VERSION_STRING "-" LASTCHANGE_STRING); -} - -void AtsRewriteOptions::Initialize() { - if (Properties::Initialize(&ats_properties_)) { - SystemRewriteOptions::Initialize(); - AddProperties(); - } -} - -void AtsRewriteOptions::Terminate() { - if (Properties::Terminate(&ats_properties_)) { - SystemRewriteOptions::Terminate(); - } -} - -bool AtsRewriteOptions::IsDirective(StringPiece config_directive, - StringPiece compare_directive) { - return StringCaseEqual(config_directive, compare_directive); -} - -RewriteOptions::OptionSettingResult AtsRewriteOptions::ParseAndSetOptions0( - StringPiece directive, GoogleString* msg, MessageHandler* handler) { - if (IsDirective(directive, "on")) { - set_enabled(RewriteOptions::kEnabledOn); - } else if (IsDirective(directive, "off")) { - set_enabled(RewriteOptions::kEnabledOff); - } else if (IsDirective(directive, "unplugged")) { - set_enabled(RewriteOptions::kEnabledUnplugged); - } else { - return RewriteOptions::kOptionNameUnknown; - } - return RewriteOptions::kOptionOk; -} - - -RewriteOptions::OptionSettingResult -AtsRewriteOptions::ParseAndSetOptionFromName1( - StringPiece name, StringPiece arg, - GoogleString* msg, MessageHandler* handler) { - // FileCachePath needs error checking. - if (StringCaseEqual(name, kFileCachePath)) { - if (!StringCaseStartsWith(arg, "/")) { - *msg = "must start with a slash"; - return RewriteOptions::kOptionValueInvalid; - } - } - - return SystemRewriteOptions::ParseAndSetOptionFromName1( - name, arg, msg, handler); -} - -bool AtsRewriteOptions::SetBoolFlag(bool* v, StringPiece arg) { - if (IsDirective(arg, "on")) { - *v=true; - return true; - } else if (IsDirective(arg, "off")) { - *v=false; - return true; - } - return false; -} - -const char* -AtsRewriteOptions::ParseAndSetOptions( - vector<string> args, MessageHandler* handler, global_settings& global_config) { - int n_args = args.size(); - CHECK_GE(n_args, 1); - - StringPiece directive = args[0]; - - // Remove initial "ModPagespeed" if there is one. - StringPiece mod_pagespeed("ModPagespeed"); - if (StringCaseStartsWith(directive, mod_pagespeed)) { - directive.remove_prefix(mod_pagespeed.size()); - } - - GoogleString msg; - OptionSettingResult result; - if (n_args == 1) { - result = ParseAndSetOptions0(directive, &msg, handler); - } else if (n_args == 2) { - StringPiece arg = args[1]; - if (IsDirective(directive, "UsePerVHostStatistics")) { - if (!SetBoolFlag(&global_config.use_per_vhost_statistics,arg)) { - msg = "Failed to set UsePerVHostStatistics value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - } /* else if (IsDirective(directive, "InstallCrashHandler")) { - // Not applicable - } */ else if (IsDirective(directive, "MessageBufferSize")) { - int message_buffer_size; - bool ok = StringToInt(arg.as_string(), &message_buffer_size); - if (ok && message_buffer_size >= 0) { - global_config.message_buffer_size = message_buffer_size; - result = RewriteOptions::kOptionOk; - } else { - msg = "Failed to set MessageBufferSize value"; - result = RewriteOptions::kOptionValueInvalid; - } - } else if (IsDirective(directive, "UseNativeFetcher")) { - if (!SetBoolFlag(&global_config.info_urls_local_only,arg)) { - msg = "Failed to set UseNativeFetcher value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - msg = "Native fetcher is not available in this release"; - - result = RewriteOptions::kOptionValueInvalid; - } - } else if (IsDirective(directive, "InfoUrlsLocalOnly")) { - if (!SetBoolFlag(&global_config.info_urls_local_only, arg)) { - msg = "Failed to set InfoUrlsLocalOnly value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - }/* else if (IsDirective(directive, "RateLimitBackgroundFetches")) { - if (!SetBoolFlag(&global_config.rate_limit_background_fetches, arg)) { - msg = "Failed to set RateLimitBackgroundFetches value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - } else if (IsDirective(directive, "ForceCaching")) { - if (!SetBoolFlag(&global_config.force_caching, arg)) { - msg = "Failed to set ForceCaching value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - } else if (IsDirective(directive, "ListOutstandingUrlsOnError")) { - if (!SetBoolFlag(&global_config.list_outstanding_urls_on_error, arg)) { - msg = "Failed to set ListOutstandingUrlsOnError value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - } else if (IsDirective(directive, "TrackOriginalContentLength")) { - if (!SetBoolFlag(&global_config.track_original_content_length, arg)) { - msg = "Failed to set TrackOriginalContentLength value"; - result = RewriteOptions::kOptionValueInvalid; - } else { - result = RewriteOptions::kOptionOk; - } - } */else { - result = ParseAndSetOptionFromName1(directive, args[1], &msg, handler); - } - } else if (n_args == 3) { - if (StringCaseEqual(directive, "CreateSharedMemoryMetadataCache")) { - int64 kb = 0; - if (!StringToInt64(args[2], &kb) || kb < 0) { - result = RewriteOptions::kOptionValueInvalid; - msg = "size_kb must be a positive 64-bit integer"; - } else { - global_config.shm_cache_size_kb = kb; - result = kOptionOk; - //bool ok = driver_factory->caches()->CreateShmMetadataCache( - // args[1].as_string(), kb, &msg); - //result = ok ? kOptionOk : kOptionValueInvalid; - } - } else { - result = ParseAndSetOptionFromName2(directive, args[1], args[2], - &msg, handler); - } - } else if (n_args == 4) { - result = ParseAndSetOptionFromName3( - directive, args[1], args[2], args[3], &msg, handler); - } else { - return "unknown option"; - } - - if (msg.size()) { - handler->Message(kWarning, "Error handling config line [%s]: [%s]", - JoinString(args, ' ').c_str(), msg.c_str()); - } - - switch (result) { - case RewriteOptions::kOptionOk: - return NULL; - case RewriteOptions::kOptionNameUnknown: - handler->Message(kWarning, "%s", JoinString(args, ' ').c_str()); - return "unknown option"; - case RewriteOptions::kOptionValueInvalid: { - handler->Message(kWarning, "%s", JoinString(args, ' ').c_str()); - return "Invalid value"; - } - } - - CHECK(false); - return NULL; -} - -AtsRewriteOptions* AtsRewriteOptions::Clone() const { - AtsRewriteOptions* options = new AtsRewriteOptions(this->thread_system()); - options->Merge(*this); - return options; -} - - -} // namespace net_instaweb - http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e8b899b0/plugins/experimental/ats_speed/ats_rewrite_options.h ---------------------------------------------------------------------- diff --git a/plugins/experimental/ats_speed/ats_rewrite_options.h b/plugins/experimental/ats_speed/ats_rewrite_options.h deleted file mode 100644 index 4a39dcd..0000000 --- a/plugins/experimental/ats_speed/ats_rewrite_options.h +++ /dev/null @@ -1,103 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#ifndef ATS_REWRITE_OPTIONS_H_ -#define ATS_REWRITE_OPTIONS_H_ - -#include <string> -#include <vector> - -#include "net/instaweb/util/public/string.h" -#include "net/instaweb/util/public/string_util.h" -#include "net/instaweb/rewriter/public/rewrite_options.h" -#include "net/instaweb/system/public/system_rewrite_options.h" - - -//#include "ats_configuration.h" - - -namespace net_instaweb { - -class ThreadSystem; - -struct global_settings { - global_settings() - : info_urls_local_only(true) - , use_native_fetcher(false) - , use_per_vhost_statistics(true) - , message_buffer_size(1024*128) - , shm_cache_size_kb(0) - //, rate_limit_background_fetches(true) - //, force_caching(false) - //, list_outstanding_urls_on_error(false) - //, track_original_content_length(false) - { - } - bool info_urls_local_only; - bool use_native_fetcher; - bool use_per_vhost_statistics; - int message_buffer_size; - //bool rate_limit_background_fetches; - //bool force_caching; - //bool list_outstanding_urls_on_error; - //bool track_original_content_length; - int shm_cache_size_kb; -}; - - -class AtsRewriteOptions : public SystemRewriteOptions { - public: - // See rewrite_options::Initialize and ::Terminate - static void Initialize(); - static void Terminate(); - - AtsRewriteOptions(ThreadSystem* thread_system); - virtual ~AtsRewriteOptions() { - } - - const char* ParseAndSetOptions( - std::vector<std::string> args, MessageHandler* handler, global_settings& global_config); - - virtual AtsRewriteOptions* Clone() const; - OptionSettingResult ParseAndSetOptions0( - StringPiece directive, GoogleString* msg, MessageHandler* handler); - - virtual OptionSettingResult ParseAndSetOptionFromName1( - StringPiece name, StringPiece arg, - GoogleString* msg, MessageHandler* handler); - - - private: - bool SetBoolFlag(bool* v, StringPiece arg); - static Properties* ats_properties_; - static void AddProperties(); - void Init(); - - bool IsDirective(StringPiece config_directive, StringPiece compare_directive); - - DISALLOW_COPY_AND_ASSIGN(AtsRewriteOptions); - }; - -} // namespace net_instaweb - -#endif // ATS_REWRITE_OPTIONS_H_
