/*
- * $Id: HttpRequest.h,v 1.22 2006/05/08 23:38:33 robertc 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.
#include "HttpMsg.h"
#include "client_side.h"
#include "HierarchyLogEntry.h"
-#include "BodyReader.h"
#include "HttpRequestMethod.h"
/* Http Request */
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();
void init();
public:
- method_t method;
+ HttpRequestMethod method;
char login[MAX_LOGIN_SZ];
- char host[SQUIDHOSTNAMELEN + 1];
+private:
+ char host[SQUIDHOSTNAMELEN];
+
+ /***
+ * The client side connection data of pinned connections for the client side
+ * request related objects
+ */
+ ConnStateData *pinned_connection;
+
+public:
+ IpAddress host_addr;
- auth_user_request_t *auth_user_request;
+ AuthUserRequest *auth_user_request;
u_short port;
int max_forwards;
- /* these in_addr's could probably be sockaddr_in's */
-
- struct IN_ADDR client_addr;
+ IpAddress client_addr;
- struct IN_ADDR my_addr;
+#if FOLLOW_X_FORWARDED_FOR
+ IpAddress indirect_client_addr;
+#endif /* FOLLOW_X_FORWARDED_FOR */
- unsigned short my_port;
-
- unsigned short client_port;
-
- BodyReader::Pointer body_reader;
+ IpAddress my_addr;
HierarchyLogEntry hier;
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(const HttpRequestMethod& unused, int64_t&) const;
- virtual bool expectingBody(method_t unused, ssize_t&) const;
+ bool bodyNibbled() const; // the request has a [partially] consumed body
int prefixLen();
static void httpRequestPack(void *obj, Packer *p);
- static HttpRequest * CreateFromUrlAndMethod(char * url, method_t method);
+ 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;
virtual void hdrCacheInit();
+ virtual bool inheritProperties(const HttpMsg *aMsg);
};
-MEMPROXY_CLASS_INLINE(HttpRequest)
+MEMPROXY_CLASS_INLINE(HttpRequest) /**DOCS_NOSEMI*/
#endif /* SQUID_HTTPREQUEST_H */