in src/HTMLViewer.cpp [66:129]
static GetContentResult getURLContent(std::string request, int maxRedirects = 5) {
GetContentResult result = { false, "", request };
if (startsWith(request, "http://127.0.0.1")) {
int pos = strlen("http://127.0.0.1");
while (pos < request.size() && request[pos] != '/') ++pos;
request.erase(request.begin(), request.begin() + pos);
}
std::vector<std::string> args, argNames;
for (int qPos = 0; qPos < request.size(); ++qPos) {
if (request[qPos] == '?') {
int start = qPos + 1;
while (start < request.size()) {
int eqPos = -1;
int end = start;
while (end < request.size() && request[end] != '&') {
if (request[end] == '=') {
eqPos = end;
}
++end;
}
std::string name, value;
if (eqPos == -1) {
name = request.substr(start, end - start);
} else {
name = request.substr(start, eqPos - start);
value = request.substr(eqPos + 1, end - (eqPos + 1));
}
args.push_back(value);
argNames.push_back(name);
start = end + 1;
}
request.erase(request.begin() + qPos, request.end());
break;
}
}
ShieldSEXP response = RI->httpd(request, makeCharacterVector(args, argNames));
if (response.type() != VECSXP) return result;
if (asInt(response["status code"]) == 302) {
if (maxRedirects > 0) {
std::string header = asStringUTF8(response["header"]);
if (startsWith(header, "Location: ")) {
return getURLContent(joinUrls(request, header.substr(strlen("Location: "))), maxRedirects - 1);
}
}
return result;
}
PrSEXP payload = response["payload"];
if (payload.type() == VECSXP) {
payload = payload["payload"];
}
if (payload.type() == STRSXP) {
result.content = asStringUTF8(RI->paste(payload, named("collapse", "\n")));
result.success = true;
return result;
}
ShieldSEXP file = response["file"];
if (isScalarString(file)) {
result.content = asStringUTF8(RI->paste(RI->readLines(file), named("collapse", "\n")));
result.success = true;
}
return result;
}