980 {
981 complete = false;
982 response.clear();
983
985 {
986 if(statusCode != 200)
987 {
988 complete = true;
989 return UnexpectedStatus(statusCode, body, "Tape REST discovery");
990 }
991
992 TapeEndpoint endpoint;
993 XrdCl::XRootDStatus status = ParseDiscoveryResponse(body, endpoint);
995 {
996 complete = true;
997 return status;
998 }
1000 {
1001 Json result;
1002 result["uri"] = endpoint.uri;
1003 result["version"] = endpoint.version;
1004 result["sitename"] = endpoint.sitename;
1005 response = result.dump();
1006 complete = true;
1008 return XrdCl::XRootDStatus();
1009 }
1010
1011 request = TapeHttpRequest();
1012 const std::string encodedRequestId = pImpl->requestId.empty()
1013 ? "" : PercentEncodeUrlPathSegment(pImpl->requestId, curl);
1014 switch(pImpl->kind)
1015 {
1017 {
1018 std::string error;
1019 Json stageBody = StageRequestBody(pImpl->stageFiles, error);
1020 if(!error.empty())
1021 {
1022 complete = true;
1024 }
1027 request.body = stageBody.dump();
1028 break;
1029 }
1032 endpoint.uri, "/stage/" + encodedRequestId);
1033 break;
1035 SetPathsPostRequest(request, endpoint.uri,
1036 "/stage/" + encodedRequestId + "/cancel", pImpl->paths);
1037 break;
1041 endpoint.uri, "/stage/" + encodedRequestId);
1042 break;
1044 SetPathsPostRequest(request, endpoint.uri,
1045 "/release/" + encodedRequestId, pImpl->paths);
1046 break;
1048 SetPathsPostRequest(request, endpoint.uri, "/archiveinfo",
1049 pImpl->paths);
1050 break;
1053 complete = true;
1055 "invalid Tape REST operation state");
1056 }
1058 return XrdCl::XRootDStatus();
1059 }
1060
1062 {
1063 complete = true;
1065 "invalid Tape REST response state");
1066 }
1067
1068 complete = true;
1070 switch(pImpl->kind)
1071 {
1073 {
1074 if(statusCode != 201)
1075 return UnexpectedStatus(statusCode, body, "stage request submission");
1077 XrdCl::XRootDStatus status =
1078 ParseJsonResponse(body,
"stage submission",
json);
1079 if(!status.
IsOK())
return status;
1080 if(!
json.contains(
"requestId") || !
json[
"requestId"].is_string()
1081 ||
json[
"requestId"].get_ref<
const std::string &>().empty())
1082 {
1084 "stage submission response does not contain a non-empty string "
1085 "requestId");
1086 }
1087 response =
json[
"requestId"].get<std::string>();
1088 return XrdCl::XRootDStatus();
1089 }
1091 {
1092 if(statusCode != 200)
1093 return UnexpectedStatus(statusCode, body, "stage request polling");
1095 XrdCl::XRootDStatus status =
1096 ParseJsonResponse(body,
"stage polling",
json);
1097 if(!status.
IsOK())
return status;
1098 Json normalizedStatus;
1099 status = NormalizeStageStatusJson(
json, normalizedStatus);
1100 if(status.
IsOK()) response = normalizedStatus.dump();
1101 return status;
1102 }
1104 return EmptyResponseStatus(statusCode, body,
1105 "stage request cancellation");
1107 return EmptyResponseStatus(statusCode, body, "stage request deletion");
1109 return EmptyResponseStatus(statusCode, body, "stage request release");
1111 if(statusCode != 200)
1112 return UnexpectedStatus(statusCode, body, "archiveinfo call");
1113 return ParseArchiveInfoResponse(body, pImpl->urls, pImpl->paths,
1114 response);
1118 "invalid Tape REST operation state");
1119 }
1121 }
static std::string JoinUrl(const std::string &base, const std::string &path)
const uint16_t errInternal
Internal error.
const uint16_t errInvalidResponse
bool IsOK() const
We're fine.