#include <stddef.h>
#include <time.h>
+
+#include <memory>
#include <string>
+#include <unordered_map>
+#include <vector>
#include "tlse.h"
Client(int sock);
// Serialization/deserialization.
- Client(const ClientProto &serialized, Stream *stream);
- ClientProto serialize() const;
+ Client(const ClientProto &serialized, const std::vector<std::shared_ptr<const std::string>> &short_responses, Stream *stream);
+ ClientProto serialize(std::unordered_map<const std::string *, size_t> *short_response_pool) const;
ClientStats get_stats() const;
//
// Must start with the string "HTTP/1.0 ", which will be changed to 1.1
// if relevant.
- std::string header_or_short_response;
+ const std::string *header_or_short_response = nullptr;
+
+ // <header_or_short_response> can come from two distinct places; it can be
+ // local to the Client object, or it can be shared between many Clients
+ // (typically HLS playlists, that can be so large that they are expensive
+ // to hold in many copies). <header_or_short_response> will point to exactly
+ // one of these, which should be cleared out/dereferenced when it is
+ // no longer needed.
+ //
+ // The use of shared_ptr is somewhat overkill since we don't need
+ // to access the HLS playlists from multiple threads, but it's not a
+ // big deal for us.
+ std::string header_or_short_response_holder;
+ std::shared_ptr<const std::string> header_or_short_response_ref;
// Number of bytes we've sent of the header. Only relevant for SENDING_HEADER
// or SENDING_SHORT_RESPONSE.