Refactored client.cpp

This commit is contained in:
2020-12-01 18:16:48 +01:00
parent 2586da8ad8
commit a1f02dba49

@ -245,7 +245,7 @@ bool connection_handler(const char *preprefix, const char *col1, const char *col
} }
try { try {
bool noRedirect, redir, invalidMethod, etag; bool noRedirect, redir, invalidMethod, etag, compress;
URI path; URI path;
pid_t childpid; pid_t childpid;
FILE *file; FILE *file;
@ -436,67 +436,65 @@ bool connection_handler(const char *preprefix, const char *col1, const char *col
} }
fclose(file); fclose(file);
file = pipes.stdout;
int c = fgetc(pipes.stdout); int c = fgetc(pipes.stdout);
if (c == -1) { if (c == -1) {
// No Data -> Error // No Data -> Error
req.respond((statuscode == 0) ? 500 : statuscode); req.respond((statuscode == 0) ? 500 : statuscode);
statuscode = -1; goto respond;
} else { } else {
ungetc(c, pipes.stdout); ungetc(c, pipes.stdout);
} }
file = pipes.stdout;
} }
if (statuscode != -1) { statuscode = (statuscode == 0) ? 200 : statuscode;
statuscode = (statuscode == 0) ? 200 : statuscode;
bool compress = (type.find("text/") == 0 || compress = (type.find("text/") == 0 ||
(type.find("application/") == 0 && type.find("+xml") != string::npos) || (type.find("application/") == 0 && type.find("+xml") != string::npos) ||
type == "application/json" || type == "application/json" ||
type == "application/javascript") && type == "application/javascript") &&
req.isExistingField("Accept-Encoding") && req.isExistingField("Accept-Encoding") &&
req.getField("Accept-Encoding").find("deflate") != string::npos; req.getField("Accept-Encoding").find("deflate") != string::npos;
if (compress) { if (compress) {
req.setField("Accept-Ranges", "none"); req.setField("Accept-Ranges", "none");
} }
if (compress && req.isExistingField("Range")) { if (compress && req.isExistingField("Range")) {
req.respond(416);
} else if (req.isExistingField("Range")) {
string range = req.getField("Range");
if (range.find("bytes=") != 0 || !path.isStatic()) {
req.respond(416); req.respond(416);
} else if (req.isExistingField("Range")) { } else {
string range = req.getField("Range"); fseek(file, 0L, SEEK_END);
if (range.find("bytes=") != 0 || !path.isStatic()) { long len = ftell(file);
fseek(file, 0L, SEEK_SET);
long p = range.find('-');
if (p == string::npos) {
req.respond(416); req.respond(416);
} else { } else {
fseek(file, 0L, SEEK_END); string part1 = range.substr(6, (unsigned long) (p - 6));
long len = ftell(file); string part2 = range.substr((unsigned long) (p + 1),
fseek(file, 0L, SEEK_SET); range.length() - p - 1);
long p = range.find('-'); long num1 = stol(part1, nullptr, 10);
if (p == string::npos) { long num2 = len - 1;
if (!part2.empty()) {
num2 = stol(part2, nullptr, 10);
}
if (num1 < 0 || num1 >= len || num2 < 0 || num2 >= len) {
req.respond(416); req.respond(416);
} else { } else {
string part1 = range.substr(6, (unsigned long) (p - 6)); req.setField("Content-Range",
string part2 = range.substr((unsigned long) (p + 1), (string) "bytes " + to_string(num1) + "-" +
range.length() - p - 1); to_string(num2) +
long num1 = stol(part1, nullptr, 10); "/" + to_string(len));
long num2 = len - 1; req.respond(206, file, compress, num1, num2);
if (!part2.empty()) {
num2 = stol(part2, nullptr, 10);
}
if (num1 < 0 || num1 >= len || num2 < 0 || num2 >= len) {
req.respond(416);
} else {
req.setField("Content-Range",
(string) "bytes " + to_string(num1) + "-" +
to_string(num2) +
"/" + to_string(len));
req.respond(206, file, compress, num1, num2);
}
} }
} }
} else {
req.respond(statuscode, file, compress);
} }
} else {
req.respond(statuscode, file, compress);
} }
fclose(file); fclose(file);
@ -508,8 +506,8 @@ bool connection_handler(const char *preprefix, const char *col1, const char *col
HttpStatusCode status = req.getStatusCode(); HttpStatusCode status = req.getStatusCode();
int code = status.code; int code = status.code;
string color = ""; string color;
string comment = ""; string comment;
if ((code >= 200 && code < 300) || code == 304) { if ((code >= 200 && code < 300) || code == 304) {
color = "\x1B[1;32m"; // Success (Cached): Green color = "\x1B[1;32m"; // Success (Cached): Green
} else if (code >= 100 && code < 200) { } else if (code >= 100 && code < 200) {