]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/AccessLogEntry.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / AccessLogEntry.h
index e26facd6e8afb6687c4a862b84170c82d5069cf9..e5cf61285754d39126e52023ef92a0926b9a6acf 100644 (file)
@@ -1,7 +1,4 @@
 /*
- * $Id: AccessLogEntry.h,v 1.9 2008/02/26 00:15:48 rousskov Exp $
- *
- *
  * SQUID Web Proxy Cache          http://www.squid-cache.org/
  * ----------------------------------------------------------
  *
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
- *  
+ *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
- *  
+ *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
 #ifndef SQUID_HTTPACCESSLOGENTRY_H
 #define SQUID_HTTPACCESSLOGENTRY_H
 
+#include "anyp/PortCfg.h"
+#include "comm/Connection.h"
 #include "HttpVersion.h"
 #include "HttpRequestMethod.h"
 #include "HierarchyLogEntry.h"
-#include "IPAddress.h"
+#include "ip/Address.h"
 #include "HttpRequestMethod.h"
+#if ICAP_CLIENT
+#include "adaptation/icap/Elements.h"
+#endif
+#include "RefCount.h"
+#if USE_SSL
+#include "ssl/gadgets.h"
+#endif
 
 /* forward decls */
 class HttpReply;
 class HttpRequest;
 
-class AccessLogEntry
+class AccessLogEntry: public RefCountable
 {
 
 public:
-    AccessLogEntry() : url(NULL) , reply(NULL), request(NULL) {}
+    typedef RefCount<AccessLogEntry> Pointer;
+
+    AccessLogEntry() : url(NULL), tcpClient(), reply(NULL), request(NULL),
+            adapted_request(NULL) {}
+    ~AccessLogEntry();
+
+    /// Fetch the client IP log string into the given buffer.
+    /// Knows about several alternate locations of the IP
+    /// including indirect forwarded-for IP if configured to log that
+    void getLogClientIp(char *buf, size_t bufsz) const;
 
     const char *url;
 
+    /// TCP/IP level details about the client connection
+    Comm::ConnectionPointer tcpClient;
+    // TCP/IP level details about the server or peer connection
+    // are stored in hier.tcpServer
+
+    /** \brief This subclass holds log info for HTTP protocol
+     * \todo Inner class declarations should be moved outside
+     * \todo details of HTTP held in the parent class need moving into here.
+     */
     class HttpDetails
     {
 
     public:
-        HttpDetails() : method(METHOD_NONE), code(0), content_type(NULL) {}
+        HttpDetails() : method(METHOD_NONE), code(0), content_type(NULL),
+                timedout(false), aborted(false) {}
 
         HttpRequestMethod method;
         int code;
         const char *content_type;
         HttpVersion version;
+        bool timedout; ///< terminated due to a lifetime or I/O timeout
+        bool aborted; ///< other abnormal termination (e.g., I/O error)
+
+        /// compute suffix for the status access.log field
+        const char *statusSfx() const {
+            return timedout ? "_TIMEDOUT" : (aborted ? "_ABORTED" : "");
+        }
     } http;
 
-    class ICPDetails
+    /** \brief This subclass holds log info for ICP protocol
+     * \todo Inner class declarations should be moved outside
+     */
+    class IcpDetails
     {
 
     public:
-        ICPDetails() : opcode(ICP_INVALID) {}
+        IcpDetails() : opcode(ICP_INVALID) {}
 
         icp_opcode opcode;
     } icp;
 
+    /** \brief This subclass holds log info for HTCP protocol
+     * \todo Inner class declarations should be moved outside
+     */
+    class HtcpDetails
+    {
+    public:
+        HtcpDetails() : opcode(NULL) {};
+
+        const char *opcode;
+    } htcp;
+
+#if USE_SSL
+    /// logging information specific to the SSL protocol
+    class SslDetails
+    {
+    public:
+        SslDetails();
+
+        const char *user; ///< emailAddress from the SSL client certificate
+        int bumpMode; ///< whether and how the request was SslBumped
+    } ssl;
+#endif
+
+    /** \brief This subclass holds log info for Squid internal stats
+     * \todo Inner class declarations should be moved outside
+     * \todo some details relevant to particular protocols need shuffling to other sub-classes
+     * \todo this object field need renaming to 'squid' or something.
+     */
     class CacheDetails
     {
 
@@ -79,22 +142,27 @@ public:
         CacheDetails() : caddr(),
                 requestSize(0),
                 replySize(0),
+                requestHeadersSize(0),
+                replyHeadersSize(0),
                 highOffset(0),
                 objectSize(0),
                 code (LOG_TAG_NONE),
                 msec(0),
                 rfc931 (NULL),
                 authuser (NULL),
-                extuser(NULL)
+                extuser(NULL),
 #if USE_SSL
-                ,ssluser(NULL)
+                ssluser(NULL),
 #endif
-        {;
+                port(NULL) {
+            ;
         }
 
-        IPAddress caddr;
+        Ip::Address caddr;
         int64_t requestSize;
         int64_t replySize;
+        int requestHeadersSize; ///< received, including request line
+        int replyHeadersSize; ///< sent, including status line
         int64_t highOffset;
         int64_t objectSize;
         log_type code;
@@ -105,22 +173,48 @@ public:
 #if USE_SSL
 
         const char *ssluser;
+        Ssl::X509_Pointer sslClientCert; ///< cert received from the client
 #endif
+        AnyP::PortCfg *port;
 
     } cache;
 
+    /** \brief This subclass holds log info for various headers in raw format
+     * \todo shuffle this to the relevant protocol section.
+     */
     class Headers
     {
 
     public:
-        Headers() : request(NULL), reply(NULL) {}
+        Headers() : request(NULL),
+                adapted_request(NULL),
+                reply(NULL) {}
+
+        char *request; //< virgin HTTP request headers
+
+        char *adapted_request; //< HTTP request headers after adaptation and redirection
 
-        char *request;
         char *reply;
     } headers;
 
+#if USE_ADAPTATION
+    /** \brief This subclass holds general adaptation log info.
+     * \todo Inner class declarations should be moved outside.
+     */
+    class AdaptationDetails
+    {
+
+    public:
+        AdaptationDetails(): last_meta(NULL) {}
+
+        /// image of the last ICAP response header or eCAP meta received
+        char *last_meta;
+    } adapt;
+#endif
+
     // Why is this a sub-class and not a set of real "private:" fields?
     // It looks like its duplicating HTTPRequestMethod anyway!
+    // TODO: shuffle this to the relevant protocol section OR replace with request->method
     class Private
     {
 
@@ -131,22 +225,60 @@ public:
     } _private;
     HierarchyLogEntry hier;
     HttpReply *reply;
-    HttpRequest *request;
+    HttpRequest *request; //< virgin HTTP request
+    HttpRequest *adapted_request; //< HTTP request after adaptation and redirection
+
+#if ICAP_CLIENT
+    /** \brief This subclass holds log info for ICAP part of request
+     *  \todo Inner class declarations should be moved outside
+     */
+    class IcapLogEntry
+    {
+    public:
+        IcapLogEntry():bodyBytesRead(-1),request(NULL),reply(NULL),outcome(Adaptation::Icap::xoUnknown),trTime(0),ioTime(0),resStatus(HTTP_STATUS_NONE) {}
+
+        Ip::Address hostAddr; ///< ICAP server IP address
+        String serviceName;        ///< ICAP service name
+        String reqUri;             ///< ICAP Request-URI
+        Adaptation::Icap::ICAP::Method reqMethod; ///< ICAP request method
+        int64_t bytesSent;       ///< number of bytes sent to ICAP server so far
+        int64_t bytesRead;       ///< number of bytes read from ICAP server so far
+        /**
+         * number of ICAP body bytes read from ICAP server or -1 for no encapsulated
+         * message data in ICAP reply (eg 204 responses)
+         */
+        int64_t bodyBytesRead;
+        HttpRequest* request;    ///< ICAP request
+        HttpReply* reply;        ///< ICAP reply
+
+        Adaptation::Icap::XactOutcome outcome; ///< final transaction status
+        /** \brief Transaction response time.
+         * The timer starts when the ICAP transaction
+         *  is created and stops when the result of the transaction is logged
+         */
+        int trTime;
+        /** \brief Transaction I/O time.
+         * The timer starts when the first ICAP request
+         * byte is scheduled for sending and stops when the lastbyte of the
+         * ICAP response is received.
+         */
+        int ioTime;
+        http_status resStatus;   ///< ICAP response status code
+        int processingTime;      ///< total ICAP processing time in milliseconds
+    }
+    icap;
+#endif
 };
 
 class ACLChecklist;
 class StoreEntry;
-class logformat_token;
 
 /* Should be in 'AccessLog.h' as the driver */
-extern void accessLogLog(AccessLogEntry *, ACLChecklist * checklist);
+extern void accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL);
+extern void accessLogLog(AccessLogEntry::Pointer &, ACLChecklist * checklist);
 extern void accessLogRotate(void);
 extern void accessLogClose(void);
 extern void accessLogInit(void);
-extern void accessLogFreeMemory(AccessLogEntry * aLogEntry);
 extern const char *accessLogTime(time_t);
-extern int accessLogParseLogFormat(logformat_token ** fmt, char *def);
-extern void accessLogDumpLogFormat(StoreEntry * entry, const char *name, logformat * definitions);
-extern void accessLogFreeLogFormat(logformat_token ** fmt);
 
 #endif /* SQUID_HTTPACCESSLOGENTRY_H */