X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=httpinput.h;fp=httpinput.h;h=894d8e946a3235b3a23fb32382f4364b38e2187f;hp=0000000000000000000000000000000000000000;hb=239a9eab1a2468b401183745a24b2fbd590a6998;hpb=684496ba9c7def1421d045435b6b92e80bc54c74 diff --git a/httpinput.h b/httpinput.h new file mode 100644 index 0000000..894d8e9 --- /dev/null +++ b/httpinput.h @@ -0,0 +1,79 @@ +#ifndef _HTTPINPUT_H +#define _HTTPINPUT_H 1 + +#include +#include + +#include "input.h" + +class InputProto; + +class HTTPInput : public Input { +public: + HTTPInput(const std::string &stream_id, const std::string &url); + + // Serialization/deserialization. + HTTPInput(const InputProto &serialized); + virtual InputProto serialize() const; + + virtual std::string get_url() const { return url; } + +private: + // Actually does the download. + virtual void do_work(); + + // Open a socket that connects to the given host and port. Does DNS resolving. + int lookup_and_connect(const std::string &host, const std::string &port); + + // Parses a HTTP response. Returns false if it not a 200. + bool parse_response(const std::string &response); + + // Stores the given data, looks for Metacube blocks (skipping data if needed), + // and calls process_block() for each one. + void process_data(char *ptr, size_t bytes); + + // Drops bytes from the head of , + // and outputs a warning. + void drop_pending_data(size_t num_bytes); + + enum State { + NOT_CONNECTED, + SENDING_REQUEST, + RECEIVING_HEADER, + RECEIVING_DATA, + CLOSING_SOCKET, // Due to error. + }; + State state; + + std::string stream_id; + + // The URL and its parsed components. + std::string url; + std::string host, port, path; + + // The HTTP request, with headers and all. + // Only relevant for SENDING_REQUEST. + std::string request; + + // How many bytes we've sent of the request so far. + // Only relevant for SENDING_REQUEST. + size_t request_bytes_sent; + + // The HTTP response we've received so far. Only relevant for RECEIVING_HEADER. + std::string response; + + // The HTTP respones headers we want to give clients for this input. + std::string http_header; + + // Data we have received but not fully processed yet. + std::vector pending_data; + + // If starts with a Metacube header, + // this is true. + bool has_metacube_header; + + // The socket we are downloading on (or -1). + int sock; +}; + +#endif // !defined(_HTTPINPUT_H)