This updates the format parser and storage objects in the Format::
namespace and separates some into separate files for SourceLayout
project dependency reductions.
Functionally it adds a registration API so components can register
themselves an array of tokens in a namespace. Registering the arbitrary
namespace "example" with some tokens ("a","b") will cause the parser to
accept those tokens in a logging format like so: "%example::a %example::b".
Due to time limitations resolving the library-library symbol
perculiarities in GCC I have had to cut short of moving the "adapt::"
and "icap::" tokens into their libraries. But have gone so far as to
make them use the registration process in this patch ready for that step.
Future work:
- convert the error pages to use format for the page body macros
- convert the %ssl_* tokens in src/ssl/* to use format and the
namespace "ssl::"
- convert external_acl_type to use formats for its helper input string.
Amos
=== modified file 'src/client_db.cc'
--- src/client_db.cc 2011-08-04 03:21:06 +0000
+++ src/client_db.cc 2011-09-11 06:40:41 +0000
@@ -34,7 +34,7 @@
#include "squid.h"
#include "event.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "ClientInfo.h"
#include "ip/Address.h"
#include "mgr/Registration.h"
=== modified file 'src/client_side_reply.cc'
--- src/client_side_reply.cc 2011-08-10 15:54:51 +0000
+++ src/client_side_reply.cc 2011-09-14 06:26:24 +0000
@@ -55,7 +55,7 @@
#endif
#include "fde.h"
#include "forward.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "HttpReply.h"
#include "HttpRequest.h"
#include "ip/QosConfig.h"
=== modified file 'src/client_side_request.cc'
--- src/client_side_request.cc 2011-11-04 23:28:49 +0000
+++ src/client_side_request.cc 2011-11-04 23:30:16 +0000
@@ -66,7 +66,7 @@
#include "comm/Write.h"
#include "compat/inet_pton.h"
#include "fde.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "HttpHdrCc.h"
#include "HttpReply.h"
#include "HttpRequest.h"
=== added file 'src/format/ByteCode.h'
--- src/format/ByteCode.h 1970-01-01 00:00:00 +0000
+++ src/format/ByteCode.h 2011-09-23 00:58:53 +0000
@@ -0,0 +1,209 @@
+#ifndef _SQUID_FMT_BYTECODE_H
+#define _SQUID_FMT_BYTECODE_H
+
+/*
+ * Squid configuration allows users to define custom formats in
+ * several components.
+ * - logging
+ * - external ACL input
+ * - deny page URL
+ *
+ * These enumerations and classes define the API for parsing of
+ * format directives to define these patterns. Along with output
+ * functionality to produce formatted buffers.
+ */
+
+namespace Format
+{
+
+/*
+ * Bytecodes for the configureable format stuff
+ */
+typedef enum {
+ LFT_NONE, /* dummy */
+
+ /* arbitrary string between tokens */
+ LFT_STRING,
+
+ /* client TCP connection remote end details */
+ LFT_CLIENT_IP_ADDRESS,
+ LFT_CLIENT_FQDN,
+ LFT_CLIENT_PORT,
+ LFT_CLIENT_EUI,
+
+ /* client TCP connection local end details */
+ LFT_CLIENT_LOCAL_IP,
+ LFT_CLIENT_LOCAL_PORT,
+ /*LFT_CLIENT_LOCAL_FQDN, (rDNS) */
+
+ /* client connection local squid.conf details */
+ LFT_LOCAL_LISTENING_IP,
+ LFT_LOCAL_LISTENING_PORT,
+ /*LFT_LOCAL_LISTENING_NAME, (myportname) */
+
+ /* server TCP connection remote end details */
+ LFT_SERVER_IP_ADDRESS,
+ LFT_SERVER_FQDN_OR_PEER_NAME,
+ LFT_SERVER_PORT,
+
+ /* server TCP connection local end details */
+ LFT_SERVER_LOCAL_IP,
+ LFT_SERVER_LOCAL_IP_OLD_27,
+ LFT_SERVER_LOCAL_PORT,
+
+ /* original Request-Line details recieved from client */
+ LFT_CLIENT_REQ_METHOD,
+ LFT_CLIENT_REQ_URI,
+ LFT_CLIENT_REQ_URLPATH,
+ /* LFT_CLIENT_REQ_QUERY, */
+ LFT_CLIENT_REQ_VERSION,
+
+ /* Request-Line details recieved from client (legacy, filtered) */
+ LFT_REQUEST_METHOD,
+ LFT_REQUEST_URI,
+ LFT_REQUEST_URLPATH_OLD_31,
+ /*LFT_REQUEST_QUERY, */
+ LFT_REQUEST_VERSION_OLD_2X,
+ LFT_REQUEST_VERSION,
+
+ /* request header details pre-adaptation */
+ LFT_REQUEST_HEADER,
+ LFT_REQUEST_HEADER_ELEM,
+ LFT_REQUEST_ALL_HEADERS,
+
+ /* request header details post-adaptation */
+ LFT_ADAPTED_REQUEST_HEADER,
+ LFT_ADAPTED_REQUEST_HEADER_ELEM,
+ LFT_ADAPTED_REQUEST_ALL_HEADERS,
+
+ /* Request-Line details sent to the server/peer */
+ LFT_SERVER_REQ_METHOD,
+ LFT_SERVER_REQ_URI,
+ LFT_SERVER_REQ_URLPATH,
+ /*LFT_SERVER_REQ_QUERY, */
+ LFT_SERVER_REQ_VERSION,
+
+ /* request meta details */
+ LFT_REQUEST_SIZE_TOTAL,
+ /*LFT_REQUEST_SIZE_LINE, */
+ LFT_REQUEST_SIZE_HEADERS,
+ /*LFT_REQUEST_SIZE_BODY, */
+ /*LFT_REQUEST_SIZE_BODY_NO_TE, */
+
+ /* original Status-Line details recieved from server */
+ // XXX: todo
+
+ /* Status-Line details sent to the client */
+ // XXX: todo
+
+ /* response Status-Line details (legacy, filtered) */
+ LFT_HTTP_SENT_STATUS_CODE_OLD_30,
+ LFT_HTTP_SENT_STATUS_CODE,
+ LFT_HTTP_RECEIVED_STATUS_CODE,
+ /*LFT_HTTP_STATUS, */
+ LFT_HTTP_BODY_BYTES_READ,
+
+ /* response header details pre-adaptation */
+ LFT_REPLY_HEADER,
+ LFT_REPLY_HEADER_ELEM,
+ LFT_REPLY_ALL_HEADERS,
+
+ /* response header details post-adaptation */
+ /* LFT_ADAPTED_REPLY_HEADER, */
+ /* LFT_ADAPTED_REPLY_HEADER_ELEM, */
+ /* LFT_ADAPTED_REPLY_ALL_HEADERS, */
+
+ /* response meta details */
+ LFT_REPLY_SIZE_TOTAL,
+ LFT_REPLY_HIGHOFFSET,
+ LFT_REPLY_OBJECTSIZE,
+ /*LFT_REPLY_SIZE_LINE, */
+ LFT_REPLY_SIZE_HEADERS,
+ /*LFT_REPLY_SIZE_BODY, */
+ /*LFT_REPLY_SIZE_BODY_NO_TE, */
+
+ /* client credentials */
+ LFT_USER_NAME, /* any source will do */
+ LFT_USER_LOGIN,
+ LFT_USER_IDENT,
+ /*LFT_USER_REALM, */
+ /*LFT_USER_SCHEME, */
+ LFT_USER_EXTERNAL,
+ /* LFT_USER_SSL_CERT, */
+
+ /* global time details */
+ LFT_TIME_SECONDS_SINCE_EPOCH,
+ LFT_TIME_SUBSECOND,
+ LFT_TIME_LOCALTIME,
+ LFT_TIME_GMT,
+
+ /* processing time details */
+ LFT_TIME_TO_HANDLE_REQUEST,
+ LFT_PEER_RESPONSE_TIME,
+ LFT_TOTAL_SERVER_SIDE_RESPONSE_TIME,
+ LFT_DNS_WAIT_TIME,
+
+ /* Squid internal processing details */
+ LFT_SQUID_STATUS,
+ LFT_SQUID_ERROR,
+ LFT_SQUID_ERROR_DETAIL,
+ LFT_SQUID_HIERARCHY,
+
+ LFT_MIME_TYPE,
+ LFT_TAG,
+ LFT_IO_SIZE_TOTAL,
+ LFT_EXT_LOG,
+
+ LFT_SEQUENCE_NUMBER,
+
+#if USE_ADAPTATION
+ LFT_ADAPTATION_SUM_XACT_TIMES,
+ LFT_ADAPTATION_ALL_XACT_TIMES,
+ LFT_ADAPTATION_LAST_HEADER,
+ LFT_ADAPTATION_LAST_HEADER_ELEM,
+ LFT_ADAPTATION_LAST_ALL_HEADERS,
+#endif
+
+#if ICAP_CLIENT
+
+ LFT_ICAP_TOTAL_TIME,
+
+ LFT_ICAP_ADDR,
+ LFT_ICAP_SERV_NAME,
+ LFT_ICAP_REQUEST_URI,
+ LFT_ICAP_REQUEST_METHOD,
+ LFT_ICAP_BYTES_SENT,
+ LFT_ICAP_BYTES_READ,
+ LFT_ICAP_BODY_BYTES_READ,
+
+ LFT_ICAP_REQ_HEADER,
+ LFT_ICAP_REQ_HEADER_ELEM,
+ LFT_ICAP_REQ_ALL_HEADERS,
+
+ LFT_ICAP_REP_HEADER,
+ LFT_ICAP_REP_HEADER_ELEM,
+ LFT_ICAP_REP_ALL_HEADERS,
+
+ LFT_ICAP_TR_RESPONSE_TIME,
+ LFT_ICAP_IO_TIME,
+ LFT_ICAP_OUTCOME,
+ LFT_ICAP_STATUS_CODE,
+#endif
+
+ LFT_PERCENT /* special string cases for escaped
chars */
+} ByteCode_t;
+
+/// Quoting style for a format output.
+enum Quoting {
+ LOG_QUOTE_NONE = 0,
+ LOG_QUOTE_QUOTES,
+ LOG_QUOTE_MIMEBLOB,
+ LOG_QUOTE_URL,
+ LOG_QUOTE_RAW
+};
+
+extern const char *log_tags[];
+
+} // namespace Format
+
+#endif /* _SQUID_FMT_BYTECODE_H */
=== added file 'src/format/Config.cc'
--- src/format/Config.cc 1970-01-01 00:00:00 +0000
+++ src/format/Config.cc 2011-11-05 11:08:25 +0000
@@ -0,0 +1,44 @@
+#include "config.h"
+#include "format/Config.h"
+#include "protos.h"
+#include <list>
+
+Format::FmtConfig Format::TheConfig;
+
+void
+Format::FmtConfig::parseFormats()
+{
+ char *name, *def;
+
+ if ((name = strtok(NULL, w_space)) == NULL)
+ self_destruct();
+
+ if ((def = strtok(NULL, "\r\n")) == NULL) {
+ self_destruct();
+ return;
+ }
+
+ debugs(3, 2, "Custom Format for '" << name << "' is '" << def << "'");
+
+ Format *nlf = new Format(name);
+
+ if (!nlf->parse(def)) {
+ self_destruct();
+ return;
+ }
+
+ // add to global config list
+ nlf->next = formats;
+ formats = nlf;
+}
+
+void
+Format::FmtConfig::registerTokens(const String &nsName, TokenTableEntry const
*tokenArray)
+{
+// assert(tokenArray != NULL);
+
+ if (tokenArray != NULL)
+ tokens.push_back(TokenNamespace(nsName, tokenArray));
+ else
+ debugs(0,0, "BUG: format tokens for '" << nsName << "' missing!");
+}
=== added file 'src/format/Config.h'
--- src/format/Config.h 1970-01-01 00:00:00 +0000
+++ src/format/Config.h 2011-11-05 11:08:10 +0000
@@ -0,0 +1,69 @@
+#ifndef SQUID_SRC_FORMAT_CONFIG_H
+#define SQUID_SRC_FORMAT_CONFIG_H
+
+#include "format/Format.h"
+#include "format/TokenTableEntry.h"
+#include "SquidString.h"
+#include <list>
+
+class StoreEntry;
+
+namespace Format
+{
+
+/// A namespace or 'set' of tokens
+/// components register their namespace prefix and an array of tokens
+/// which can then be embeded in any format.
+class TokenNamespace
+{
+public:
+ explicit TokenNamespace(const String &nsName, TokenTableEntry const *tSet)
: prefix(nsName), tokenSet(tSet) {};
+ ~TokenNamespace() {};
+
+ /// prefix namespace name (excluding '::')
+ String prefix;
+
+ /// array of tokens inside this namespace
+ TokenTableEntry const *tokenSet;
+};
+
+class FmtConfig
+{
+public:
+ void parseFormats();
+ void dumpFormats(StoreEntry *e, const char *name) {
+ formats->dump(e, name);
+ }
+
+ /* Register a namespace set of tokens to be accepted by the format parser.
+ * Multiple arrays can be registered, they will be scanned for
+ * in order registered. So care needs to be taken that arrays registered
+ * first do not overlap or consume tokens registered later for a namespace.
+ */
+ void registerTokens(const String &nsName, TokenTableEntry const
*tokenArray);
+
+ /// Linked list of custom formats
+ Format *formats;
+
+ /// list of token namespaces registered
+ std::list<TokenNamespace> tokens;
+
+#if USE_ADAPTATION
+ bool hasAdaptToken;
+#endif
+
+#if ICAP_CLIENT
+ bool hasIcapToken;
+#endif
+};
+
+extern FmtConfig TheConfig;
+
+} // namespace Format
+
+// Legacy parsing wrappers
+#define parse_format(X) (X)->parseFormats()
+#define free_format(X) do{ delete (*X).formats; (*X).formats=NULL;
}while(false)
+#define dump_format(E,N,D) (D).dumpFormats((E),(N))
+
+#endif
=== modified file 'src/format/Format.cc'
--- src/format/Format.cc 2011-10-14 01:49:17 +0000
+++ src/format/Format.cc 2011-10-16 05:00:24 +0000
@@ -5,7 +5,7 @@
#include "errorpage.h"
#include "format/Format.h"
#include "format/Quoting.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "HttpRequest.h"
#include "MemBuf.h"
#include "rfc1738.h"
@@ -516,7 +516,7 @@
break;
#if USE_ADAPTATION
- case LTF_ADAPTATION_SUM_XACT_TIMES:
+ case LFT_ADAPTATION_SUM_XACT_TIMES:
if (al->request) {
Adaptation::History::Pointer ah = al->request->adaptHistory();
if (ah != NULL)
@@ -525,7 +525,7 @@
}
break;
- case LTF_ADAPTATION_ALL_XACT_TIMES:
+ case LFT_ADAPTATION_ALL_XACT_TIMES:
if (al->request) {
Adaptation::History::Pointer ah = al->request->adaptHistory();
if (ah != NULL)
=== modified file 'src/format/Makefile.am'
--- src/format/Makefile.am 2011-08-04 03:21:06 +0000
+++ src/format/Makefile.am 2011-09-11 06:58:13 +0000
@@ -4,10 +4,14 @@
noinst_LTLIBRARIES = libformat.la
libformat_la_SOURCES = \
+ ByteCode.h \
+ Config.cc \
+ Config.h \
Format.cc \
Format.h \
Quoting.cc \
Quoting.h \
- Tokens.cc \
- Tokens.h
+ Token.cc \
+ Token.h \
+ TokenTableEntry.h
=== renamed file 'src/format/Tokens.cc' => 'src/format/Token.cc'
--- src/format/Tokens.cc 2011-10-13 17:05:25 +0000
+++ src/format/Token.cc 2011-11-05 11:07:28 +0000
@@ -1,5 +1,6 @@
#include "config.h"
-#include "format/Tokens.h"
+#include "format/Config.h"
+#include "format/Token.h"
#include "Store.h"
const char *Format::log_tags[] = {
@@ -36,7 +37,7 @@
{
/// 1-char tokens.
-static struct TokenTableEntry TokenTable1C[] = {
+static TokenTableEntry TokenTable1C[] = {
{">a", LFT_CLIENT_IP_ADDRESS},
{">p", LFT_CLIENT_PORT},
@@ -59,7 +60,7 @@
};
/// 2-char tokens
-static struct TokenTableEntry TokenTable2C[] = {
+static TokenTableEntry TokenTable2C[] = {
{">la", LFT_CLIENT_LOCAL_IP},
{"la", LFT_LOCAL_LISTENING_IP},
@@ -143,19 +144,26 @@
{NULL, LFT_NONE} /* this must be last */
};
+/// Miscellaneous >2 byte tokens
+static TokenTableEntry TokenTableMisc[] = {
+ {">eui", LFT_CLIENT_EUI},
+ {"err_code", LFT_SQUID_ERROR },
+ {"err_detail", LFT_SQUID_ERROR_DETAIL },
+ {NULL, LFT_NONE} /* this must be last */
+};
+
#if USE_ADAPTATION
-/// Adaptation (adapt::) tokens
-static struct TokenTableEntry TokenTableAdapt[] = {
- {"all_trs", LTF_ADAPTATION_ALL_XACT_TIMES},
- {"sum_trs", LTF_ADAPTATION_SUM_XACT_TIMES},
+static TokenTableEntry TokenTableAdapt[] = {
+ {"all_trs", LFT_ADAPTATION_ALL_XACT_TIMES},
+ {"sum_trs", LFT_ADAPTATION_SUM_XACT_TIMES},
{"<last_h", LFT_ADAPTATION_LAST_HEADER},
- {NULL, LFT_NONE} /* this must be last */
+ {NULL, LFT_NONE} /* this must be last */
};
#endif
#if ICAP_CLIENT
/// ICAP (icap::) tokens
-static struct TokenTableEntry TokenTableIcap[] = {
+static TokenTableEntry TokenTableIcap[] = {
{"tt", LFT_ICAP_TOTAL_TIME},
{"<last_h", LFT_ADAPTATION_LAST_HEADER}, // deprecated
@@ -163,38 +171,47 @@
{"<service_name", LFT_ICAP_SERV_NAME},
{"ru", LFT_ICAP_REQUEST_URI},
{"rm", LFT_ICAP_REQUEST_METHOD},
- {">st", LFT_ICAP_BYTES_SENT},
- {"<st", LFT_ICAP_BYTES_READ},
+ {">st", LFT_ICAP_BYTES_SENT},
+ {"<st", LFT_ICAP_BYTES_READ},
{"<bs", LFT_ICAP_BODY_BYTES_READ},
{">h", LFT_ICAP_REQ_HEADER},
{"<h", LFT_ICAP_REP_HEADER},
{"tr", LFT_ICAP_TR_RESPONSE_TIME},
- {"tio", LFT_ICAP_IO_TIME},
+ {"tio", LFT_ICAP_IO_TIME},
{"to", LFT_ICAP_OUTCOME},
{"Hs", LFT_ICAP_STATUS_CODE},
- {NULL, LFT_NONE} /* this must be last */
+ {NULL, LFT_NONE} /* this must be last */
};
#endif
-/// Miscellaneous >2 byte tokens
-static struct TokenTableEntry TokenTableMisc[] = {
- {">eui", LFT_CLIENT_EUI},
- {"err_code", LFT_SQUID_ERROR },
- {"err_detail", LFT_SQUID_ERROR_DETAIL },
- {NULL, LFT_NONE} /* this must be last */
-};
-
} // namespace Format
+/// Register all components custom format tokens
+void
+Format::Token::Init()
+{
+ // TODO standard log tokens
+ // TODO external ACL fmt tokens
+
+#if USE_ADAPTATION
+ TheConfig.registerTokens(String("adapt"),TokenTableAdapt);
+#endif
+#if ICAP_CLIENT
+ TheConfig.registerTokens(String("icap"),TokenTableIcap);
+#endif
+
+ // TODO tokens for OpenSSL errors in "ssl::"
+}
+
/// Scans a token table to see if the next token exists there
/// returns a pointer to next unparsed byte and updates type member if found
char *
-Format::Token::scanForToken(const struct TokenTableEntry *table, char *cur)
+Format::Token::scanForToken(TokenTableEntry const table[], char *cur)
{
- for (const struct TokenTableEntry *lte = table; lte->config != NULL;
lte++) {
+ for (TokenTableEntry const *lte = table; lte->config != NULL; lte++) {
if (strncmp(lte->config, cur, strlen(lte->config)) == 0) {
type = lte->token_type;
label = lte->config;
@@ -322,26 +339,20 @@
type = LFT_NONE;
- // Scan each token namespace
- if (strncmp(cur, "icap::", 6) == 0) {
-#if ICAP_CLIENT
- cur += 6;
- debugs(46, 5, HERE << "scan for icap:: token");
- cur = scanForToken(TokenTableIcap, cur);
-#else
- debugs(46, DBG_IMPORTANT, "ERROR: Format uses icap:: token. ICAP
disabled!");
-#endif
- } else if (strncmp(cur, "adapt::", 7) == 0) {
-#if USE_ADAPTATION
- cur += 7;
- debugs(46, 5, HERE << "scan for adapt:: token");
- cur = scanForToken(TokenTableAdapt, cur);
-#else
- debugs(46, DBG_IMPORTANT, "ERROR: Format uses adapt:: token.
Adaptation disabled!");
-#endif
- } else {
+ // Scan each registered token namespace
+ for (std::list<TokenNamespace>::const_iterator itr =
TheConfig.tokens.begin(); itr != TheConfig.tokens.end(); itr++) {
+ const size_t len = itr->prefix.size();
+ if (itr->prefix.cmp(cur, len) != 0 && cur[len+1] == ':' && cur[len+2]
== ':') {
+ const char *old = cur;
+ cur = scanForToken(itr->tokenSet, cur);
+ if (old != cur) // found
+ break;
+ }
+ }
+
+ if (type == LFT_NONE) {
// For upward compatibility, assume "http::" prefix as default prefix
- // for all log access formating codes, except those starting with a
+ // for all log access formatting codes, except those starting with a
// "%" or a known namespace. (ie "icap::", "adapt::")
if (strncmp(cur,"http::", 6) == 0 && *(cur+6) != '%' )
cur += 6;
=== renamed file 'src/format/Tokens.h' => 'src/format/Token.h'
--- src/format/Tokens.h 2011-10-13 17:05:25 +0000
+++ src/format/Token.h 2011-11-05 08:38:12 +0000
@@ -1,5 +1,7 @@
-#ifndef _SQUID_FMT_TOKENS_H
-#define _SQUID_FMT_TOKENS_H
+#ifndef _SQUID_FORMAT_TOKEN_H
+#define _SQUID_FORMAT_TOKEN_H
+
+#include "format/TokenTableEntry.h"
/*
* Squid configuration allows users to define custom formats in
@@ -18,168 +20,6 @@
#define LOG_BUF_SZ (MAX_URL<<2)
-/*
- * Bytecodes for the configureable format stuff
- */
-typedef enum {
- LFT_NONE, /* dummy */
- LFT_STRING,
-
- LFT_CLIENT_IP_ADDRESS,
- LFT_CLIENT_FQDN,
- LFT_CLIENT_PORT,
- LFT_CLIENT_EUI,
-
- LFT_SERVER_IP_ADDRESS,
- LFT_SERVER_FQDN_OR_PEER_NAME,
- LFT_SERVER_PORT,
-
- LFT_CLIENT_LOCAL_IP,
- LFT_LOCAL_LISTENING_IP,
- LFT_CLIENT_LOCAL_PORT,
- LFT_LOCAL_LISTENING_PORT,
- /*LFT_LOCAL_NAME, */
-
- LFT_SERVER_LOCAL_IP,
- LFT_SERVER_LOCAL_IP_OLD_27,
- LFT_SERVER_LOCAL_PORT,
-
- LFT_TIME_SECONDS_SINCE_EPOCH,
- LFT_TIME_SUBSECOND,
- LFT_TIME_LOCALTIME,
- LFT_TIME_GMT,
- LFT_TIME_TO_HANDLE_REQUEST,
-
- LFT_PEER_RESPONSE_TIME,
- LFT_TOTAL_SERVER_SIDE_RESPONSE_TIME,
- LFT_DNS_WAIT_TIME,
-
- LFT_REQUEST_HEADER,
- LFT_REQUEST_HEADER_ELEM,
- LFT_REQUEST_ALL_HEADERS,
-
- LFT_ADAPTED_REQUEST_HEADER,
- LFT_ADAPTED_REQUEST_HEADER_ELEM,
- LFT_ADAPTED_REQUEST_ALL_HEADERS,
-
- LFT_REPLY_HEADER,
- LFT_REPLY_HEADER_ELEM,
- LFT_REPLY_ALL_HEADERS,
-
- LFT_USER_NAME,
- LFT_USER_LOGIN,
- LFT_USER_IDENT,
- /*LFT_USER_REALM, */
- /*LFT_USER_SCHEME, */
- LFT_USER_EXTERNAL,
-
- LFT_HTTP_SENT_STATUS_CODE_OLD_30,
- LFT_HTTP_SENT_STATUS_CODE,
- LFT_HTTP_RECEIVED_STATUS_CODE,
- /*LFT_HTTP_STATUS, */
- LFT_HTTP_BODY_BYTES_READ,
-
- LFT_SQUID_STATUS,
- LFT_SQUID_ERROR,
- LFT_SQUID_ERROR_DETAIL,
- LFT_SQUID_HIERARCHY,
-
- LFT_MIME_TYPE,
-
- /* original Request-Line details receved from client */
- LFT_CLIENT_REQ_METHOD,
- LFT_CLIENT_REQ_URI,
- LFT_CLIENT_REQ_URLPATH,
- /* LFT_CLIENT_REQ_QUERY, */
- LFT_CLIENT_REQ_VERSION,
-
- /* Request-Line details receved from client (legacy, filtered) */
- LFT_REQUEST_METHOD,
- LFT_REQUEST_URI,
- LFT_REQUEST_URLPATH_OLD_31,
- /*LFT_REQUEST_QUERY, */
- LFT_REQUEST_VERSION_OLD_2X,
- LFT_REQUEST_VERSION,
-
- /* Request-Line details sent to the server/peer */
- LFT_SERVER_REQ_METHOD,
- LFT_SERVER_REQ_URI,
- LFT_SERVER_REQ_URLPATH,
- /*LFT_SERVER_REQ_QUERY, */
- LFT_SERVER_REQ_VERSION,
-
- LFT_REQUEST_SIZE_TOTAL,
- /*LFT_REQUEST_SIZE_LINE, */
- LFT_REQUEST_SIZE_HEADERS,
- /*LFT_REQUEST_SIZE_BODY, */
- /*LFT_REQUEST_SIZE_BODY_NO_TE, */
-
- LFT_REPLY_SIZE_TOTAL,
- LFT_REPLY_HIGHOFFSET,
- LFT_REPLY_OBJECTSIZE,
- /*LFT_REPLY_SIZE_LINE, */
- LFT_REPLY_SIZE_HEADERS,
- /*LFT_REPLY_SIZE_BODY, */
- /*LFT_REPLY_SIZE_BODY_NO_TE, */
-
- LFT_TAG,
- LFT_IO_SIZE_TOTAL,
- LFT_EXT_LOG,
-
- LFT_SEQUENCE_NUMBER,
-
-#if USE_ADAPTATION
- LTF_ADAPTATION_SUM_XACT_TIMES,
- LTF_ADAPTATION_ALL_XACT_TIMES,
- LFT_ADAPTATION_LAST_HEADER,
- LFT_ADAPTATION_LAST_HEADER_ELEM,
- LFT_ADAPTATION_LAST_ALL_HEADERS,
-#endif
-
-#if ICAP_CLIENT
-
- LFT_ICAP_TOTAL_TIME,
-
- LFT_ICAP_ADDR,
- LFT_ICAP_SERV_NAME,
- LFT_ICAP_REQUEST_URI,
- LFT_ICAP_REQUEST_METHOD,
- LFT_ICAP_BYTES_SENT,
- LFT_ICAP_BYTES_READ,
- LFT_ICAP_BODY_BYTES_READ,
-
- LFT_ICAP_REQ_HEADER,
- LFT_ICAP_REQ_HEADER_ELEM,
- LFT_ICAP_REQ_ALL_HEADERS,
-
- LFT_ICAP_REP_HEADER,
- LFT_ICAP_REP_HEADER_ELEM,
- LFT_ICAP_REP_ALL_HEADERS,
-
- LFT_ICAP_TR_RESPONSE_TIME,
- LFT_ICAP_IO_TIME,
- LFT_ICAP_OUTCOME,
- LFT_ICAP_STATUS_CODE,
-#endif
-
- LFT_PERCENT /* special string cases for escaped
chars */
-} ByteCode_t;
-
-/// Quoting style for a format output.
-enum Quoting {
- LOG_QUOTE_NONE = 0,
- LOG_QUOTE_QUOTES,
- LOG_QUOTE_MIMEBLOB,
- LOG_QUOTE_URL,
- LOG_QUOTE_RAW
-};
-
-struct TokenTableEntry {
- const char *config;
- ByteCode_t token_type;
- int options;
-};
-
// XXX: inherit from linked list
class Token
{
@@ -197,6 +37,9 @@
{ data.string = NULL; };
~Token();
+ /// Initialize the format token registrations
+ static void Init();
+
/** parses a single token. Returns the token length in characters,
* and fills in this item with the token information.
* def is for sure null-terminated.
@@ -225,11 +68,11 @@
Token *next; /* todo: move from linked list to array */
private:
- char *scanForToken(const struct TokenTableEntry *table, char *cur);
+ char *scanForToken(TokenTableEntry const table[], char *cur);
};
extern const char *log_tags[];
} // namespace Format
-#endif /* _SQUID_FMT_TOKENS_H */
+#endif /* _SQUID_FORMAT_TOKEN_H */
=== added file 'src/format/TokenTableEntry.h'
--- src/format/TokenTableEntry.h 1970-01-01 00:00:00 +0000
+++ src/format/TokenTableEntry.h 2011-10-08 06:15:13 +0000
@@ -0,0 +1,30 @@
+#ifndef _SQUID_FORMAT_TOKENTABLEENTRY_H
+#define _SQUID_FORMAT_TOKENTABLEENTRY_H
+
+#include "format/ByteCode.h"
+
+/*
+ * Squid configuration allows users to define custom formats in
+ * several components.
+ * - logging
+ * - external ACL input
+ * - deny page URL
+ *
+ * These enumerations and classes define the API for parsing of
+ * format directives to define these patterns. Along with output
+ * functionality to produce formatted buffers.
+ */
+
+namespace Format
+{
+
+class TokenTableEntry {
+public:
+ const char *config;
+ ByteCode_t token_type;
+ int options;
+};
+
+} // namespace Format
+
+#endif /* _SQUID_FORMAT_TOKENTABLEENTRY_H */
=== modified file 'src/log/FormatHttpdCombined.cc'
--- src/log/FormatHttpdCombined.cc 2011-08-04 03:21:06 +0000
+++ src/log/FormatHttpdCombined.cc 2011-09-11 06:30:44 +0000
@@ -34,7 +34,7 @@
#include "config.h"
#include "AccessLogEntry.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "format/Quoting.h"
#include "HttpRequest.h"
#include "log/File.h"
=== modified file 'src/log/FormatHttpdCommon.cc'
--- src/log/FormatHttpdCommon.cc 2011-08-04 03:21:06 +0000
+++ src/log/FormatHttpdCommon.cc 2011-09-11 06:31:17 +0000
@@ -35,7 +35,7 @@
#include "config.h"
#include "AccessLogEntry.h"
#include "format/Quoting.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "log/File.h"
#include "log/Formats.h"
#include "SquidTime.h"
=== modified file 'src/log/FormatSquidCustom.cc'
--- src/log/FormatSquidCustom.cc 2011-08-04 03:21:06 +0000
+++ src/log/FormatSquidCustom.cc 2011-09-11 06:34:32 +0000
@@ -34,7 +34,6 @@
#include "config.h"
#include "AccessLogEntry.h"
-#include "format/Tokens.h"
#include "log/File.h"
#include "log/Formats.h"
#include "MemBuf.h"
=== modified file 'src/log/FormatSquidNative.cc'
--- src/log/FormatSquidNative.cc 2011-08-20 15:57:06 +0000
+++ src/log/FormatSquidNative.cc 2011-09-11 06:35:16 +0000
@@ -35,7 +35,7 @@
#include "config.h"
#include "AccessLogEntry.h"
#include "format/Quoting.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "log/File.h"
#include "log/Formats.h"
#include "SquidTime.h"
=== modified file 'src/log/access_log.cc'
--- src/log/access_log.cc 2011-09-09 20:41:40 +0000
+++ src/log/access_log.cc 2011-09-22 11:32:19 +0000
@@ -47,7 +47,7 @@
#include "eui/Eui48.h"
#include "eui/Eui64.h"
#endif
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "hier_code.h"
#include "HttpReply.h"
#include "HttpRequest.h"
@@ -322,8 +322,8 @@
#if USE_ADAPTATION
for (Format::Token * curr_token =
(log->logFormat?log->logFormat->format:NULL); curr_token; curr_token =
curr_token->next) {
- if (curr_token->type == Format::LTF_ADAPTATION_SUM_XACT_TIMES ||
- curr_token->type == Format::LTF_ADAPTATION_ALL_XACT_TIMES
||
+ if (curr_token->type == Format::LFT_ADAPTATION_SUM_XACT_TIMES ||
+ curr_token->type == Format::LFT_ADAPTATION_ALL_XACT_TIMES
||
curr_token->type == Format::LFT_ADAPTATION_LAST_HEADER ||
curr_token->type ==
Format::LFT_ADAPTATION_LAST_HEADER_ELEM ||
curr_token->type ==
Format::LFT_ADAPTATION_LAST_ALL_HEADERS) {
=== modified file 'src/main.cc'
--- src/main.cc 2011-11-03 10:02:02 +0000
+++ src/main.cc 2011-11-05 09:41:52 +0000
@@ -63,6 +63,7 @@
#include "event.h"
#include "EventLoop.h"
#include "ExternalACL.h"
+#include "format/Token.h"
#include "fs/Module.h"
#include "PeerSelectState.h"
#include "Store.h"
@@ -1105,6 +1106,8 @@
// TODO: pconn is a good candidate for new-style registration
// PconnModule::GetInstance()->registerWithCacheManager();
// moved to PconnModule::PconnModule()
+
+ Format::Token::Init();
}
if (IamPrimaryProcess()) {
=== modified file 'src/stat.cc'
--- src/stat.cc 2011-10-14 16:21:48 +0000
+++ src/stat.cc 2011-10-16 05:00:24 +0000
@@ -34,7 +34,7 @@
#include "squid.h"
#include "event.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "StoreClient.h"
#if USE_AUTH
#include "auth/UserRequest.h"
=== modified file 'src/store_log.cc'
--- src/store_log.cc 2011-08-04 03:21:06 +0000
+++ src/store_log.cc 2011-09-11 06:54:54 +0000
@@ -33,7 +33,7 @@
*/
#include "squid.h"
-#include "format/Tokens.h"
+#include "format/Token.h"
#include "HttpReply.h"
#include "log/File.h"
#include "MemObject.h"