X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=client.cpp;h=786e17825817e9bfa9360042a099c411646254c7;hp=e7a12f6c8ef395691f3dfa86efc12d2fda228efe;hb=8095c4ac52431d9e593ece77bdc21566a2ed9240;hpb=b57530552825a13a3cd1924bda99e5e237c722a4 diff --git a/client.cpp b/client.cpp index e7a12f6..786e178 100644 --- a/client.cpp +++ b/client.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -63,6 +64,8 @@ Client::Client(int sock) Client::Client(const ClientProto &serialized, Stream *stream) : sock(serialized.sock()), remote_addr(serialized.remote_addr()), + referer(serialized.referer()), + user_agent(serialized.user_agent()), state(State(serialized.state())), request(serialized.request()), url(serialized.url()), @@ -81,17 +84,8 @@ Client::Client(const ClientProto &serialized, Stream *stream) } } } - if (serialized.has_connect_time_old()) { - // Do a rough conversion from time() to monotonic time. - if (clock_gettime(CLOCK_MONOTONIC_COARSE, &connect_time) == -1) { - log_perror("clock_gettime(CLOCK_MONOTONIC_COARSE)"); - return; - } - connect_time.tv_sec += serialized.connect_time_old() - time(NULL); - } else { - connect_time.tv_sec = serialized.connect_time_sec(); - connect_time.tv_nsec = serialized.connect_time_nsec(); - } + connect_time.tv_sec = serialized.connect_time_sec(); + connect_time.tv_nsec = serialized.connect_time_nsec(); } ClientProto Client::serialize() const @@ -99,6 +93,8 @@ ClientProto Client::serialize() const ClientProto serialized; serialized.set_sock(sock); serialized.set_remote_addr(remote_addr); + serialized.set_referer(referer); + serialized.set_user_agent(user_agent); serialized.set_connect_time_sec(connect_time.tv_sec); serialized.set_connect_time_nsec(connect_time.tv_nsec); serialized.set_state(state); @@ -112,6 +108,24 @@ ClientProto Client::serialize() const serialized.set_num_loss_events(num_loss_events); return serialized; } + +namespace { + +string escape_string(const string &str) { + string ret; + for (size_t i = 0; i < str.size(); ++i) { + char buf[16]; + if (isprint(str[i]) && str[i] >= 32 && str[i] != '"' && str[i] != '\\') { + ret.push_back(str[i]); + } else { + snprintf(buf, sizeof(buf), "\\x%02x", (unsigned char)str[i]); + ret += buf; + } + } + return ret; +} + +} // namespace ClientStats Client::get_stats() const { @@ -123,6 +137,8 @@ ClientStats Client::get_stats() const } stats.sock = sock; stats.remote_addr = remote_addr; + stats.referer = escape_string(referer); + stats.user_agent = escape_string(user_agent); stats.connect_time = connect_time; stats.bytes_sent = bytes_sent; stats.bytes_lost = bytes_lost;