return -1;
}
-bool HTTPInput::parse_response(const std::string &request)
+bool HTTPInput::parse_response(const string &request)
{
vector<string> lines = split_lines(response);
if (lines.empty()) {
return false;
}
- multimap<string, string> parameters;
- for (size_t i = 1; i < lines.size(); ++i) {
- size_t split = lines[i].find(":");
- if (split == string::npos) {
- log(WARNING, "[%s] Ignoring malformed HTTP response line '%s'",
- url.c_str(), lines[i].c_str());
- continue;
- }
-
- string key(lines[i].begin(), lines[i].begin() + split);
-
- // Skip any spaces after the colon.
- do {
- ++split;
- } while (split < lines[i].size() && lines[i][split] == ' ');
+ multimap<string, string> parameters = extract_headers(lines, url);
- string value(lines[i].begin() + split, lines[i].end());
-
- // Remove “Content-encoding: metacube”.
- // TODO: Make case-insensitive.
- if (key == "Content-encoding" && value == "metacube") {
- continue;
- }
-
- parameters.insert(make_pair(key, value));
+ // Remove “Content-encoding: metacube”.
+ // TODO: Make case-insensitive.
+ multimap<string, string>::iterator encoding_it =
+ parameters.find("Content-encoding");
+ if (encoding_it != parameters.end() && encoding_it->second == "metacube") {
+ parameters.erase(encoding_it);
}
// Change “Server: foo” to “Server: metacube/0.1 (reflecting: foo)”
// TODO: Make the timeout persist across restarts.
if (state == SENDING_REQUEST || state == RECEIVING_HEADER || state == RECEIVING_DATA) {
- int err = clock_gettime(CLOCK_MONOTONIC, &last_activity);
+ int err = clock_gettime(CLOCK_MONOTONIC_COARSE, &last_activity);
assert(err != -1);
}
static const int timeout_secs = 30;
timespec now;
- int err = clock_gettime(CLOCK_MONOTONIC, &now);
+ int err = clock_gettime(CLOCK_MONOTONIC_COARSE, &now);
assert(err != -1);
timespec elapsed = clock_diff(last_activity, now);
bool activity = wait_for_activity(sock, (state == SENDING_REQUEST) ? POLLOUT : POLLIN, &timeout);
if (activity) {
- err = clock_gettime(CLOCK_MONOTONIC, &last_activity);
+ err = clock_gettime(CLOCK_MONOTONIC_COARSE, &last_activity);
assert(err != -1);
} else {
// OK. Most likely, should_stop was set, or we have timed out.
MutexLock lock(&stats_mutex);
stats.connect_time = time(NULL);
- clock_gettime(CLOCK_MONOTONIC, &last_activity);
+ clock_gettime(CLOCK_MONOTONIC_COARSE, &last_activity);
}
break;
case SENDING_REQUEST: {
if (num_bytes == 0) {
return;
}
- log(WARNING, "[%s] Dropping %lld junk bytes from stream, maybe it is not a Metacube2 stream?",
+ log(WARNING, "[%s] Dropping %lld junk bytes; not a Metacube2 stream, or data was dropped from the middle of the 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);