-#include <stdio.h>
#include <assert.h>
#include <errno.h>
#include <netdb.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
+#include <time.h>
#include <unistd.h>
#include <map>
#include <string>
void HTTPInput::close_socket()
{
- safe_close(sock);
+ if (sock != -1) {
+ safe_close(sock);
+ }
}
InputProto HTTPInput::serialize() const
{
addrinfo *ai;
int err = getaddrinfo(host.c_str(), port.c_str(), NULL, &ai);
- if (err == -1) {
+ if (err != 0) {
log(WARNING, "[%s] Lookup of '%s' failed (%s).",
url.c_str(), host.c_str(), gai_strerror(err));
- freeaddrinfo(ai);
return -1;
}
addrinfo *base_ai = ai;
// Connect to everything in turn until we have a socket.
- while (ai && !should_stop()) {
+ for ( ; ai && !should_stop(); ai = ai->ai_next) {
int sock = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP);
if (sock == -1) {
// Could be e.g. EPROTONOSUPPORT. The show must go on.
}
safe_close(sock);
- ai = ai->ai_next;
}
// Give the last one as error.
request_bytes_sent = 0;
response.clear();
pending_data.clear();
+ has_metacube_header = false;
for (size_t i = 0; i < stream_indices.size(); ++i) {
servers->set_header(stream_indices[i], "", "");
}
if (ret == 0) {
// This really shouldn't happen...
- log(ERROR, "[%s] Socket unexpectedly closed while reading header",
+ log(ERROR, "[%s] Socket unexpectedly closed while reading data",
url.c_str());
state = CLOSING_SOCKET;
continue;
}
log(WARNING, "[%s] Dropping %lld junk bytes from stream, maybe it is not a Metacube stream?",
url.c_str(), (long long)num_bytes);
+ assert(pending_data.size() >= num_bytes);
pending_data.erase(pending_data.begin(), pending_data.begin() + num_bytes);
}