static GetContentResult getURLContent()

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;
}