/*
- * $Id: http.h,v 1.9 2003/08/10 11:00:43 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 "StoreIOBuffer.h"
#include "comm.h"
+#include "forward.h"
+#include "Server.h"
+#include "ChunkedCodingParser.h"
-class HttpStateData
+class HttpStateData : public ServerStateData
{
public:
- static CWCB SendComplete;
- void processReplyHeader(const char *, int);
- void processReplyData(const char *, size_t);
- IOCB readReply;
- void maybeReadData();
+ HttpStateData(FwdState *);
+ ~HttpStateData();
+
+ static void httpBuildRequestHeader(HttpRequest * request,
+ HttpRequest * orig_request,
+ StoreEntry * entry,
+ HttpHeader * hdr_out,
+ http_state_flags flags);
+
+ virtual int dataDescriptor() const;
+ /* should be private */
+ bool sendRequest();
+ void processReplyHeader();
+ void processReplyBody();
+ void readReply(const CommIoCbParams &io);
+ virtual void maybeReadVirginBody(); // read response data from the network
int cacheableReply();
- StoreEntry *entry;
- HttpRequest *request;
- char *reply_hdr;
- size_t reply_hdr_size;
- int reply_hdr_state;
peer *_peer; /* peer request made to */
int eof; /* reached end-of-object? */
+ int lastChunk; /* reached last chunk of a chunk-encoded reply */
HttpRequest *orig_request;
int fd;
http_state_flags flags;
- FwdState *fwd;
- off_t currentOffset;
- int do_next_read;
size_t read_sz;
- char buf[SQUID_TCP_SO_RCVBUF];
+ int header_bytes_read; // to find end of response,
+ int reply_bytes_read; // without relying on StoreEntry
+ MemBuf *readBuf;
bool ignoreCacheControl;
bool surrogateNoStore;
+
void processSurrogateControl(HttpReply *);
+protected:
+ virtual HttpRequest *originalRequest();
+
private:
+ AsyncCall::Pointer closeHandler;
enum ConnectionStatus {
INCOMPLETE_MSG,
COMPLETE_PERSISTENT_MSG,
};
ConnectionStatus statusIfComplete() const;
ConnectionStatus persistentConnStatus() const;
+ void keepaliveAccounting(HttpReply *);
+ void checkDateSkew(HttpReply *);
+
+ bool continueAfterParsingHeader();
+
+ virtual void haveParsedReplyHeaders();
+ virtual void closeServer(); // end communication with the server
+ virtual bool doneWithServer() const; // did we end communication?
+ virtual void abortTransaction(const char *reason); // abnormal termination
+
+ // consuming request body
+ virtual void handleMoreRequestBodyAvailable();
+ virtual void handleRequestBodyProducerAborted();
+
+ void writeReplyBody();
+ bool decodeAndWriteReplyBody();
+ void doneSendingRequestBody();
+ void requestBodyHandler(MemBuf &);
+ virtual void sentRequestBody(const CommIoCbParams &io);
+ void sendComplete(const CommIoCbParams &io);
+ void httpStateConnClosed(const CommCloseCbParams ¶ms);
+ void httpTimeout(const CommTimeoutCbParams ¶ms);
+
+ mb_size_t buildRequestPrefix(HttpRequest * request,
+ HttpRequest * orig_request,
+ StoreEntry * entry,
+ MemBuf * mb,
+ http_state_flags flags);
+ static bool decideIfWeDoRanges (HttpRequest * orig_request);
+ bool peerSupportsConnectionPinning() const;
+
+ ChunkedCodingParser *httpChunkDecoder;
+private:
+ CBDATA_CLASS2(HttpStateData);
};
#endif /* SQUID_HTTP_H */