]> git.sesse.net Git - cubemap/blobdiff - client.cpp
Parse and log referer and user-agent headers in requests.
[cubemap] / client.cpp
index f191a40d89bae094e4e717d6a098805f2d45a381..786e17825817e9bfa9360042a099c411646254c7 100644 (file)
@@ -1,3 +1,4 @@
+#include <stdio.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <stdint.h>
@@ -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()),
@@ -90,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);
@@ -103,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
 {
@@ -114,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;