/*
- * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
#include "http/StatusLine.h"
#include "HttpBody.h"
-#include "HttpMsg.h"
#include "HttpRequest.h"
void httpReplyInitModule(void);
class HttpHdrSc;
-class HttpReply: public HttpMsg
+class HttpReply: public Http::Message
{
MEMPROXY_CLASS(HttpReply);
HttpHdrSc *surrogate_control;
- HttpHdrContRange *content_range;
+ /// \returns parsed Content-Range for a 206 response and nil for others
+ const HttpHdrContRange *contentRange() const;
short int keep_alive;
virtual bool expectingBody(const HttpRequestMethod&, int64_t&) const;
- virtual bool inheritProperties(const HttpMsg *aMsg);
+ virtual bool inheritProperties(const Http::Message *);
- void updateOnNotModified(HttpReply const *other);
+ /// \returns nil (if no updates are necessary)
+ /// \returns a new reply combining this reply with 304 updates (otherwise)
+ Pointer recreateOnNotModified(const HttpReply &reply304) const;
/** set commonly used info with one call */
void setHeaders(Http::StatusCode status,
const char *reason, const char *ctype, int64_t clen, time_t lmt, time_t expires);
/** \return a ready to use mem buffer with a packed reply */
- MemBuf *pack();
+ MemBuf *pack() const;
+
+ /// construct and return an HTTP/200 (Connection Established) response
+ static HttpReplyPointer MakeConnectionEstablished();
/** construct a 304 reply and return it */
- HttpReply *make304() const;
+ HttpReplyPointer make304() const;
void redirect(Http::StatusCode, const char *);
int validatorsMatch (HttpReply const *other) const;
- void packHeadersInto(Packable * p) const;
+ /// adds status line and header to the given Packable
+ /// assumes that `p` can quickly process small additions
+ void packHeadersUsingFastPacker(Packable &p) const;
+ /// same as packHeadersUsingFastPacker() but assumes that `p` cannot quickly process small additions
+ void packHeadersUsingSlowPacker(Packable &p) const;
/** Clone this reply.
- * Could be done as a copy-contructor but we do not want to accidently copy a HttpReply..
+ * Could be done as a copy-contructor but we do not want to accidentally copy a HttpReply..
*/
HttpReply *clone() const;
virtual void hdrCacheInit();
+ /// whether our Date header value is smaller than theirs
+ /// \returns false if any information is missing
+ bool olderThan(const HttpReply *them) const;
+
+ /// Some response status codes prohibit sending Content-Length (RFC 7230 section 3.3.2).
+ void removeIrrelevantContentLength();
+
+ virtual void configureContentLengthInterpreter(Http::ContentLengthInterpreter &);
+ /// parses reply header using Parser
+ bool parseHeader(Http1::Parser &hp);
+
private:
/** initialize */
void init();
void hdrCacheClean();
- void packInto(Packable * p);
+ void packInto(MemBuf &) const;
/* ez-routines */
/** \return construct 304 reply and pack it into a MemBuf */
- MemBuf *packed304Reply();
+ MemBuf *packed304Reply() const;
/* header manipulation */
time_t hdrExpirationTime();
mutable int64_t bodySizeMax; /**< cached result of calcMaxBodySize */
+ HttpHdrContRange *content_range; ///< parsed Content-Range; nil for non-206 responses!
+
protected:
virtual void packFirstLineInto(Packable * p, bool) const { sline.packInto(p); }