| /* |
| 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. |
| */ |
| |
| #define CRIPTS_CONVENIENCE_APIS 1 |
| |
| // The primary include file, this has to always be included |
| #include <cripts/Preamble.hpp> |
| |
| #include <cripts/Bundles/Common.hpp> |
| #include <cripts/Bundles/Caching.hpp> |
| |
| // Globals for this Cript |
| ACL(CRIPT_ALLOW, {"192.168.201.0/24", "10.0.0.0/8"}); |
| |
| // This is called only when the plugin is initialized |
| do_init() |
| { |
| // TSDebug("Cript", "Hello, example1 plugin is being initialized"); |
| } |
| |
| do_create_instance() |
| { |
| CreateCounter(0, "cript.example1.c0"); |
| CreateCounter(1, "cript.example1.c1"); |
| CreateCounter(2, "cript.example1.c2"); |
| CreateCounter(3, "cript.example1.c3"); |
| CreateCounter(4, "cript.example1.c4"); |
| CreateCounter(5, "cript.example1.c5"); |
| CreateCounter(6, "cript.example1.c6"); |
| CreateCounter(7, "cript.example1.c7"); |
| CreateCounter(8, "cript.example1.c8"); // This one should resize the storage |
| |
| cripts::Bundle::Common::Activate().dscp(10); |
| cripts::Bundle::Caching::Activate().cache_control("max-age=259200"); |
| } |
| |
| do_txn_close() |
| { |
| client.connection.pacing = cripts::Pacing::Off; |
| CDebug("Cool, TXN close also works"); |
| } |
| |
| do_cache_lookup() |
| { |
| CDebug("Cache URL: {}", cached.url); |
| CDebug("Cache Host: {}", cached.url.host); |
| } |
| |
| do_send_request() |
| { |
| server.request["X-Leif"] = "Meh"; |
| } |
| |
| do_read_response() |
| { |
| server.response["X-DBJ"] = "Vrooom!"; |
| } |
| |
| do_send_response() |
| { |
| string msg = "Eliminate TSCPP"; |
| |
| client.response["Server"] = ""; // Deletes the Server header |
| client.response["X-AMC"] = msg; // New header |
| client.response["Cache-Control"] = "Private"; // Deletes old CC values, and sets a new one |
| client.response["X-UUID"] = UniqueUUID(); |
| client.response["X-tcpinfo"] = client.connection.tcpinfo.Log(); |
| client.response["X-Cache-Status"] = cached.response.lookupstatus.GetSV(); |
| client.response["X-Integer"] = 666; |
| client.response["X-Data"] = AsString(txn_data[2]); |
| |
| client.response["X-ASN"] = client.connection.geo.ASN(); |
| client.response["X-ASN-Name"] = client.connection.geo.ASNName(); |
| client.response["X-Country"] = client.connection.geo.Country(); |
| client.response["X-ISO-Country"] = client.connection.geo.CountryCode(); |
| |
| // Setup some connection parameters |
| client.connection.congestion = "bbr"; |
| client.connection.dscp = 8; |
| client.connection.pacing = 100000; |
| client.connection.mark = 17; |
| |
| // Some file operations (note that the paths aren't required here, can just be strings, but it's a good practice) |
| FilePath(p1, "/tmp/foo"); |
| FilePath(p2, "/tmp/secret.txt"); |
| |
| if (cripts::File::Status(p1).type() == cripts::File::Type::regular) { |
| client.response["X-Foo-Exists"] = "yes"; |
| } else { |
| client.response["X-Foo-Exists"] = "no"; |
| } |
| |
| string secret = cripts::File::Line::Reader(p2); |
| CDebug("Read secret = {}", secret); |
| |
| if (client.response.status == 200) { |
| client.response.status = 222; |
| } |
| |
| CDebug("Txn count: {}", client.connection.Count()); |
| } |
| |
| do_remap() |
| { |
| auto ip = client.connection.IP(); |
| auto now = LocalTimeNow(); |
| |
| if (CRIPT_ALLOW.Match(ip)) { |
| CDebug("Client IP allowed: {}", ip.string(24, 64)); |
| } |
| |
| CDebug("Epoch time is {} (or via .epoch(), {}", now, now.Epoch()); |
| CDebug("Year is {}", now.Year()); |
| CDebug("Month is {}", now.Month()); |
| CDebug("Day is {}", now.Day()); |
| CDebug("Hour is {}", now.Hour()); |
| CDebug("Day number is {}", now.YearDay()); |
| |
| CDebug("from_url = {}", instance.from_url.c_str()); |
| CDebug("to_url = {}", instance.to_url.c_str()); |
| |
| // Turn off the cache for testing |
| // proxy.config.http.cache.http.set(1); |
| // control.cache.nostore.set(true); |
| |
| CDebug("Int config cache.http = {}", proxy.config.http.cache.http.Get()); |
| CDebug("Float config cache.heuristic_lm_factor = {}", proxy.config.http.cache.heuristic_lm_factor.Get()); |
| CDebug("String config http.response_server_str = {}", proxy.config.http.response_server_str.GetSV(context)); |
| CDebug("X-Miles = {}", client.request["X-Miles"]); |
| CDebug("random(1000) = {}", cripts::Random(1000)); |
| |
| auto old_port = urls.request.port; |
| |
| CDebug("Method is {}", client.request.method); |
| CDebug("Scheme is {}", urls.request.scheme); |
| CDebug("Host is {}", urls.request.host); |
| CDebug("Port is {}", urls.request.port); |
| CDebug("Path is {}", urls.request.path); |
| CDebug("Path[1] is {}", urls.request.path[1]); |
| CDebug("Query is {}", urls.request.query); |
| |
| auto testing_trim = urls.request.path.trim(); |
| |
| CDebug("Trimmed path is {}", testing_trim); |
| |
| if (urls.request.query["foo"] > 100) { |
| CDebug("Query[foo] is > 100"); |
| } |
| |
| if (urls.request.path == "some/url" || urls.request.path[0] == "other") { |
| CDebug("The path comparison triggered"); |
| } |
| |
| urls.request.host = "foobar.com"; |
| urls.request.port = "81"; |
| urls.request.port = old_port; |
| |
| // TXN data slots |
| txn_data[0] = true; |
| txn_data[1] = 17; |
| txn_data[2] = "DBJ"; |
| |
| // Regular expressions |
| Regex(pcre, "^/([^/]+)/(.*)$"); |
| |
| auto res = pcre.Match("/foo/bench/bar"); // Can also call contains(), same thing |
| |
| if (res) { |
| CDebug("Ovector count is {}", res.Count()); |
| CDebug("First capture is {}", res[1]); |
| CDebug("Second capture is {}", res[2]); |
| } else { |
| CDebug("Regular expression did not match, that is not expected!"); |
| } |
| |
| // ATS versions |
| CDebug("ATS version = {}", version); |
| CDebug("ATS Major Version = {}", version.major); |
| |
| // Some Crypto::Base64 tests |
| static auto base64_test = "VGltZSB3aWxsIG5vdCBzbG93IGRvd24gd2hlbiBzb21ldGhpbmcgdW5wbGVhc2FudCBsaWVzIGFoZWFkLg=="; |
| auto hp = cripts::Crypto::Base64::Decode(base64_test); |
| auto hp2 = cripts::Crypto::Base64::Encode(hp); |
| |
| CDebug("HP quote: {}", hp); |
| if (base64_test != hp2) { |
| CDebug("Base64 failed: {}", hp2); |
| } else { |
| CDebug("Base64 encode reproduced the decoded HP string"); |
| } |
| |
| // Some Crypto::Escape (URL escaping) tests |
| static auto escape_test = "Hello_World_!@%23$%25%5E&*()_%2B%3C%3E?%2C.%2F"; |
| auto uri = cripts::Crypto::Escape::Decode(escape_test); |
| auto uri2 = cripts::Crypto::Escape::Encode(uri); |
| |
| CDebug("Unescaped URI: {}", uri); |
| if (escape_test != uri2) { |
| CDebug("URL Escape failed: {}", uri2); |
| } else { |
| CDebug("Url Escape encode reproduced the decoded HP string"); |
| } |
| |
| // Testing Crypto SHA and encryption |
| auto hex = format("{}", cripts::Crypto::SHA256::Encode("Hello World")); |
| |
| CDebug("SHA256 = {}", hex); |
| |
| // Testing iterators |
| for (auto hdr : client.request) { |
| CDebug("Header: {} = {}", hdr, client.request[hdr]); |
| if (hdr.starts_with("AWS-")) { |
| client.request[hdr].clear(); |
| } |
| } |
| |
| // Testing some simple metrics |
| static auto m1 = cripts::Metrics::Gauge("cript.example1.m1"); |
| static auto m2 = cripts::Metrics::Counter("cript.example1.m2"); |
| |
| m1.Increment(100); |
| m1.Decrement(10); |
| m2.Increment(); |
| |
| instance.metrics[0]->Increment(); |
| instance.metrics[8]->Increment(); |
| } |
| |
| #include <cripts/Epilogue.hpp> |