X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=httpinput.cpp;h=74466c7acbb671f33f4f0fa3a76c77091e324038;hp=80daa1a8a220e1b5b4d93ca3be99145dc2f35854;hb=94cd6d8799191a79fde828abfbc30cf9951c1cfc;hpb=979a284b4039b0ea74525b700b9f1089b8c4248d diff --git a/httpinput.cpp b/httpinput.cpp index 80daa1a..74466c7 100644 --- a/httpinput.cpp +++ b/httpinput.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,7 @@ #include "parse.h" #include "serverpool.h" #include "state.pb.h" +#include "stream.h" #include "util.h" #include "version.h" @@ -74,15 +76,8 @@ HTTPInput::HTTPInput(const InputProto &serialized) pending_data.resize(serialized.pending_data().size()); memcpy(&pending_data[0], serialized.pending_data().data(), serialized.pending_data().size()); - string protocol; - parse_url(url, &protocol, &host, &port, &path); // Don't care if it fails. - - // Older versions stored the extra \r\n in the HTTP header. - // Strip it if we find it. - if (http_header.size() >= 4 && - memcmp(http_header.data() + http_header.size() - 4, "\r\n\r\n", 4) == 0) { - http_header.resize(http_header.size() - 2); - } + string protocol, user; + parse_url(url, &protocol, &user, &host, &port, &path); // Don't care if it fails. pthread_mutex_init(&stats_mutex, NULL); stats.url = url; @@ -99,6 +94,7 @@ void HTTPInput::close_socket() { if (sock != -1) { safe_close(sock); + sock = -1; } MutexLock lock(&stats_mutex); @@ -344,8 +340,8 @@ void HTTPInput::do_work() } { - string protocol; // Thrown away. - if (!parse_url(url, &protocol, &host, &port, &path)) { + string protocol, user; // Thrown away. + if (!parse_url(url, &protocol, &user, &host, &port, &path)) { log(WARNING, "[%s] Failed to parse URL '%s'", url.c_str(), url.c_str()); break; } @@ -416,7 +412,7 @@ void HTTPInput::do_work() RequestParseStatus status = wait_for_double_newline(&response, buf, ret); if (status == RP_OUT_OF_SPACE) { - log(WARNING, "[%s] Sever sent overlong HTTP response!", url.c_str()); + log(WARNING, "[%s] Server sent overlong HTTP response!", url.c_str()); state = CLOSING_SOCKET; continue; } else if (status == RP_NOT_FINISHED_YET) { @@ -535,16 +531,17 @@ void HTTPInput::process_data(char *ptr, size_t bytes) } // Now it's safe to read the header. - metacube2_block_header *hdr = reinterpret_cast(pending_data.data()); - assert(memcmp(hdr->sync, METACUBE2_SYNC, sizeof(hdr->sync)) == 0); - uint32_t size = ntohl(hdr->size); - uint16_t flags = ntohs(hdr->flags); - uint16_t expected_csum = metacube2_compute_crc(hdr); - - if (expected_csum != ntohs(hdr->csum)) { + metacube2_block_header hdr; + memcpy(&hdr, pending_data.data(), sizeof(hdr)); + assert(memcmp(hdr.sync, METACUBE2_SYNC, sizeof(hdr.sync)) == 0); + uint32_t size = ntohl(hdr.size); + uint16_t flags = ntohs(hdr.flags); + uint16_t expected_csum = metacube2_compute_crc(&hdr); + + if (expected_csum != ntohs(hdr.csum)) { log(WARNING, "[%s] Metacube checksum failed (expected 0x%x, got 0x%x), " "not reading block claiming to be %d bytes (flags=%x).", - url.c_str(), expected_csum, ntohs(hdr->csum), + url.c_str(), expected_csum, ntohs(hdr.csum), size, flags); // Drop only the first byte, and let the rest of the code handle resync.