984 if(pImpl->phase == Impl::Phase::Discovery)
986 if(statusCode != 200)
989 return UnexpectedStatus(statusCode, body,
"Tape REST discovery");
992 TapeEndpoint endpoint;
999 if(pImpl->kind == Impl::Kind::Discover)
1002 result[
"uri"] = endpoint.uri;
1003 result[
"version"] = endpoint.version;
1004 result[
"sitename"] = endpoint.sitename;
1005 response = result.dump();
1007 pImpl->phase = Impl::Phase::Complete;
1011 request = TapeHttpRequest();
1012 const std::string encodedRequestId = pImpl->requestId.empty()
1013 ?
"" : PercentEncodeUrlPathSegment(pImpl->requestId, curl);
1016 case Impl::Kind::Stage:
1019 Json stageBody = StageRequestBody(pImpl->stageFiles, error);
1025 request.method = HttpVerb::POST;
1027 request.body = stageBody.dump();
1030 case Impl::Kind::StageStatus:
1032 endpoint.uri,
"/stage/" + encodedRequestId);
1034 case Impl::Kind::StageCancel:
1035 SetPathsPostRequest(request, endpoint.uri,
1036 "/stage/" + encodedRequestId +
"/cancel", pImpl->paths);
1038 case Impl::Kind::StageDelete:
1039 request.method = HttpVerb::DELETE;
1041 endpoint.uri,
"/stage/" + encodedRequestId);
1043 case Impl::Kind::Release:
1044 SetPathsPostRequest(request, endpoint.uri,
1045 "/release/" + encodedRequestId, pImpl->paths);
1047 case Impl::Kind::ArchiveInfo:
1048 SetPathsPostRequest(request, endpoint.uri,
"/archiveinfo",
1051 case Impl::Kind::Invalid:
1052 case Impl::Kind::Discover:
1055 "invalid Tape REST operation state");
1057 pImpl->phase = Impl::Phase::Request;
1061 if(pImpl->phase != Impl::Phase::Request)
1065 "invalid Tape REST response state");
1069 pImpl->phase = Impl::Phase::Complete;
1072 case Impl::Kind::Stage:
1074 if(statusCode != 201)
1075 return UnexpectedStatus(statusCode, body,
"stage request submission");
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())
1084 "stage submission response does not contain a non-empty string "
1087 response =
json[
"requestId"].get<std::string>();
1090 case Impl::Kind::StageStatus:
1092 if(statusCode != 200)
1093 return UnexpectedStatus(statusCode, body,
"stage request polling");
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();
1103 case Impl::Kind::StageCancel:
1104 return EmptyResponseStatus(statusCode, body,
1105 "stage request cancellation");
1106 case Impl::Kind::StageDelete:
1107 return EmptyResponseStatus(statusCode, body,
"stage request deletion");
1108 case Impl::Kind::Release:
1109 return EmptyResponseStatus(statusCode, body,
"stage request release");
1110 case Impl::Kind::ArchiveInfo:
1111 if(statusCode != 200)
1112 return UnexpectedStatus(statusCode, body,
"archiveinfo call");
1113 return ParseArchiveInfoResponse(body, pImpl->urls, pImpl->paths,
1115 case Impl::Kind::Invalid:
1116 case Impl::Kind::Discover:
1118 "invalid Tape REST operation state");
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.