blob: 97dbae58533b6a8e702f60f8799b491366dcf15d [file] [log] [blame]
// Copyright (c) 2026 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "quiche/quic/moqt/moqt_error.h"
#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_logging.h"
#include "quiche/web_transport/web_transport.h"
namespace moqt {
RequestErrorCode StatusToRequestErrorCode(absl::Status status) {
QUICHE_DCHECK(!status.ok());
switch (status.code()) {
case absl::StatusCode::kPermissionDenied:
return RequestErrorCode::kUnauthorized;
case absl::StatusCode::kDeadlineExceeded:
return RequestErrorCode::kTimeout;
case absl::StatusCode::kUnimplemented:
return RequestErrorCode::kNotSupported;
case absl::StatusCode::kNotFound:
return RequestErrorCode::kTrackDoesNotExist;
case absl::StatusCode::kOutOfRange:
return RequestErrorCode::kInvalidRange;
case absl::StatusCode::kInvalidArgument:
return RequestErrorCode::kInvalidJoiningRequestId;
case absl::StatusCode::kUnauthenticated:
return RequestErrorCode::kExpiredAuthToken;
default:
return RequestErrorCode::kInternalError;
}
}
absl::StatusCode RequestErrorCodeToStatusCode(RequestErrorCode error_code) {
switch (error_code) {
case RequestErrorCode::kInternalError:
return absl::StatusCode::kInternal;
case RequestErrorCode::kUnauthorized:
return absl::StatusCode::kPermissionDenied;
case RequestErrorCode::kTimeout:
return absl::StatusCode::kDeadlineExceeded;
case RequestErrorCode::kNotSupported:
return absl::StatusCode::kUnimplemented;
case RequestErrorCode::kTrackDoesNotExist:
// Equivalently, kUninterested and kNamespacePrefixUnknown.
return absl::StatusCode::kNotFound;
case RequestErrorCode::kInvalidRange:
// Equivalently, kNamespacePrefixOverlap.
return absl::StatusCode::kOutOfRange;
case RequestErrorCode::kNoObjects:
// Equivalently, kRetryTrackAlias.
return absl::StatusCode::kNotFound;
case RequestErrorCode::kInvalidJoiningRequestId:
case RequestErrorCode::kMalformedAuthToken:
return absl::StatusCode::kInvalidArgument;
case RequestErrorCode::kExpiredAuthToken:
return absl::StatusCode::kUnauthenticated;
default:
return absl::StatusCode::kUnknown;
}
}
absl::Status RequestErrorCodeToStatus(RequestErrorCode error_code,
absl::string_view reason_phrase) {
return absl::Status(RequestErrorCodeToStatusCode(error_code), reason_phrase);
};
absl::Status MoqtStreamErrorToStatus(webtransport::StreamErrorCode error_code,
absl::string_view reason_phrase) {
switch (error_code) {
case kResetCodeCanceled:
return absl::CancelledError(reason_phrase);
case kResetCodeDeliveryTimeout:
return absl::DeadlineExceededError(reason_phrase);
case kResetCodeSessionClosed:
return absl::AbortedError(reason_phrase);
case kResetCodeMalformedTrack:
return absl::InvalidArgumentError(reason_phrase);
default:
return absl::UnknownError(reason_phrase);
}
}
} // namespace moqt