Identify UDPInput error messages by the stream, too.
[cubemap] / httpinput.h
1 #ifndef _HTTPINPUT_H
2 #define _HTTPINPUT_H 1
3
4 #include <stddef.h>
5 #include <string>
6 #include <vector>
7
8 #include "input.h"
9
10 class InputProto;
11
12 class HTTPInput : public Input {
13 public:
14         HTTPInput(const std::string &stream_id, const std::string &url);
15
16         // Serialization/deserialization.
17         HTTPInput(const InputProto &serialized);
18         virtual InputProto serialize() const;
19         
20         virtual void close_socket();
21
22         virtual std::string get_url() const { return url; }
23
24 private:
25         // Actually does the download.
26         virtual void do_work();
27         
28         // Open a socket that connects to the given host and port. Does DNS resolving.
29         int lookup_and_connect(const std::string &host, const std::string &port);
30
31         // Parses a HTTP response. Returns false if it not a 200.
32         bool parse_response(const std::string &response);
33
34         // Stores the given data, looks for Metacube blocks (skipping data if needed),
35         // and calls process_block() for each one.
36         void process_data(char *ptr, size_t bytes);
37
38         // Drops <num_bytes> bytes from the head of <pending_data>,
39         // and outputs a warning.
40         void drop_pending_data(size_t num_bytes);
41
42         enum State {
43                 NOT_CONNECTED,
44                 SENDING_REQUEST,
45                 RECEIVING_HEADER,
46                 RECEIVING_DATA,
47                 CLOSING_SOCKET,  // Due to error.
48         };
49         State state;
50
51         std::string stream_id;
52
53         // The URL and its parsed components.
54         std::string url;
55         std::string host, port, path;
56
57         // The HTTP request, with headers and all.
58         // Only relevant for SENDING_REQUEST.
59         std::string request;
60
61         // How many bytes we've sent of the request so far.
62         // Only relevant for SENDING_REQUEST.
63         size_t request_bytes_sent;
64
65         // The HTTP response we've received so far. Only relevant for RECEIVING_HEADER.
66         std::string response;
67
68         // The HTTP respones headers we want to give clients for this input.
69         std::string http_header;
70
71         // Data we have received but not fully processed yet.
72         std::vector<char> pending_data;
73
74         // If <pending_data> starts with a Metacube header,
75         // this is true.
76         bool has_metacube_header;
77
78         // The socket we are downloading on (or -1).
79         int sock;       
80 };
81
82 #endif  // !defined(_HTTPINPUT_H)