]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/HttpRequest.h
Cleanup: zap CVS Id tags
[thirdparty/squid.git] / src / HttpRequest.h
index 48aeb95a4d8e2f605ec2f14a53b4cc93b6b0f4fb..455bd74c8b750cead47d822d763d0c7145f43dde 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: HttpRequest.h,v 1.19 2006/02/17 18:10:59 wessels Exp $
+ * $Id$
  *
  *
  * 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.
@@ -37,6 +37,7 @@
 #include "HttpMsg.h"
 #include "client_side.h"
 #include "HierarchyLogEntry.h"
+#include "HttpRequestMethod.h"
 
 /*  Http Request */
 extern int httpRequestHdrAllowed(const HttpHeaderEntry * e, String * strConnection);
@@ -52,17 +53,37 @@ class HttpRequest: public HttpMsg
 public:
     MEMPROXY_CLASS(HttpRequest);
     HttpRequest();
-    HttpRequest(method_t aMethod, protocol_t aProtocol, const char *aUrlpath);
+    HttpRequest(const HttpRequestMethod& aMethod, protocol_t aProtocol, const char *aUrlpath);
     ~HttpRequest();
     virtual void reset();
 
     // use HTTPMSGLOCK() instead of calling this directly
-    virtual HttpRequest *_lock()
-    {
+    virtual HttpRequest *_lock() {
         return static_cast<HttpRequest*>(HttpMsg::_lock());
     };
 
-    void initHTTP(method_t aMethod, protocol_t aProtocol, const char *aUrlpath);
+    void initHTTP(const HttpRequestMethod& aMethod, protocol_t aProtocol, const char *aUrlpath);
+
+    virtual HttpRequest *clone() const;
+
+    /* are responses to this request potentially cachable */
+    bool cacheable() const;
+
+    /* Now that we care what host contains it is better off being protected. */
+    /* HACK: These two methods are only inline to get around Makefile dependancies */
+    /*      caused by HttpRequest being used in places it really shouldn't.        */
+    /*      ideally they would be methods of URL instead. */
+    inline void SetHost(const char *src) {
+        host_addr.SetEmpty();
+        host_addr = src;
+        if ( host_addr.IsAnyAddr() ) {
+            xstrncpy(host, src, SQUIDHOSTNAMELEN);
+        } else {
+            host_addr.ToHostname(host, SQUIDHOSTNAMELEN);
+            debugs(23, 3, "HttpRequest::SetHost() given IP: " << host_addr);
+        }
+    };
+    inline const char* GetHost(void) const { return host; };
 
 protected:
     void clean();
@@ -70,13 +91,23 @@ protected:
     void init();
 
 public:
-    method_t method;
+    HttpRequestMethod method;
 
     char login[MAX_LOGIN_SZ];
 
-    char host[SQUIDHOSTNAMELEN + 1];
+private:
+    char host[SQUIDHOSTNAMELEN];
 
-    auth_user_request_t *auth_user_request;
+    /***
+     * The client side connection data of pinned connections for the client side
+     * request related objects
+     */
+    ConnStateData *pinned_connection;
+
+public:
+    IpAddress host_addr;
+
+    AuthUserRequest *auth_user_request;
 
     u_short port;
 
@@ -94,17 +125,13 @@ public:
 
     int max_forwards;
 
-    /* these in_addr's could probably be sockaddr_in's */
-
-    struct IN_ADDR client_addr;
-
-    struct IN_ADDR my_addr;
+    IpAddress client_addr;
 
-    unsigned short my_port;
+#if FOLLOW_X_FORWARDED_FOR
+    IpAddress indirect_client_addr;
+#endif /* FOLLOW_X_FORWARDED_FOR */
 
-    unsigned short client_port;
-
-    ConnStateData::Pointer body_connection;    /* used by clientReadBody() */
+    IpAddress my_addr;
 
     HierarchyLogEntry hier;
 
@@ -126,14 +153,20 @@ public:
 
     String extacl_log;         /* String to be used for access.log purposes */
 
+#if FOLLOW_X_FORWARDED_FOR
+    String x_forwarded_for_iterator; /* XXX a list of IP addresses */
+#endif /* FOLLOW_X_FORWARDED_FOR */
+
 public:
     bool multipartRangeRequest() const;
 
     bool parseFirstLine(const char *start, const char *end);
 
-    int parseHeader(const char *parse_start);
+    int parseHeader(const char *parse_start, int len);
 
-    virtual bool expectingBody(method_t unused, ssize_t&) const;
+    virtual bool expectingBody(const HttpRequestMethod& unused, int64_t&) const;
+
+    bool bodyNibbled() const; // the request has a [partially] consumed body
 
     int prefixLen();
 
@@ -143,6 +176,22 @@ public:
 
     static void httpRequestPack(void *obj, Packer *p);
 
+    static HttpRequest * CreateFromUrlAndMethod(char * url, const HttpRequestMethod& method);
+
+    static HttpRequest * CreateFromUrl(char * url);
+
+    void setPinnedConnection(ConnStateData *conn) {
+        pinned_connection = cbdataReference(conn);
+    }
+
+    ConnStateData *pinnedConnection() {
+        return pinned_connection;
+    }
+
+    void releasePinnedConnection() {
+        cbdataReferenceDone(pinned_connection);
+    }
+
 private:
     const char *packableURI(bool full_uri) const;
 
@@ -153,8 +202,9 @@ protected:
 
     virtual void hdrCacheInit();
 
+    virtual bool inheritProperties(const HttpMsg *aMsg);
 };
 
-MEMPROXY_CLASS_INLINE(HttpRequest)
+MEMPROXY_CLASS_INLINE(HttpRequest)          /**DOCS_NOSEMI*/
 
 #endif /* SQUID_HTTPREQUEST_H */