mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00
Update SetHeaderExtensionsToNegotiate to match specification
following the updates from https://github.com/w3c/webrtc-extensions/pull/142 BUG=chromium:1051821 Change-Id: I2d561bad1ddffb412bdd7e66cf62a3cb5fc73791 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/296480 Reviewed-by: Markus Handell <handellm@webrtc.org> Reviewed-by: Markus Handell <handellm@google.com> Commit-Queue: Philipp Hancke <phancke@microsoft.com> Reviewed-by: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/main@{#39500}
This commit is contained in:
parent
88047adc26
commit
c8c25e5bdf
2 changed files with 56 additions and 39 deletions
|
@ -745,47 +745,34 @@ bool IsMandatoryHeaderExtension(const std::string& uri) {
|
||||||
|
|
||||||
RTCError RtpTransceiver::SetHeaderExtensionsToNegotiate(
|
RTCError RtpTransceiver::SetHeaderExtensionsToNegotiate(
|
||||||
rtc::ArrayView<const RtpHeaderExtensionCapability> header_extensions) {
|
rtc::ArrayView<const RtpHeaderExtensionCapability> header_extensions) {
|
||||||
for (const auto& entry : header_extensions) {
|
// https://w3c.github.io/webrtc-extensions/#methods
|
||||||
// Handle unsupported requests for mandatory extensions as per
|
if (header_extensions.size() != header_extensions_to_negotiate_.size()) {
|
||||||
// https://w3c.github.io/webrtc-extensions/#rtcrtptransceiver-interface.
|
return RTCError(RTCErrorType::INVALID_MODIFICATION,
|
||||||
// Note:
|
"Size of extensions to negotiate does not match.");
|
||||||
// - We do not handle setOfferedRtpHeaderExtensions algorithm step 2.1,
|
|
||||||
// this has to be checked on a higher level. We naturally error out
|
|
||||||
// in the handling of Step 2.2 if an unset URI is encountered.
|
|
||||||
|
|
||||||
// Step 2.2.
|
|
||||||
// Handle unknown extensions.
|
|
||||||
auto it = std::find_if(
|
|
||||||
header_extensions_to_negotiate_.begin(),
|
|
||||||
header_extensions_to_negotiate_.end(),
|
|
||||||
[&entry](const auto& offered) { return entry.uri == offered.uri; });
|
|
||||||
if (it == header_extensions_to_negotiate_.end()) {
|
|
||||||
return RTCError(RTCErrorType::UNSUPPORTED_PARAMETER,
|
|
||||||
"Attempted to modify an unoffered extension.");
|
|
||||||
}
|
}
|
||||||
|
// For each index i of extensions, run the following steps: ...
|
||||||
// Step 2.4-2.5.
|
for (size_t i = 0; i < header_extensions.size(); i++) {
|
||||||
if (IsMandatoryHeaderExtension(entry.uri) &&
|
const auto& extension = header_extensions[i];
|
||||||
entry.direction != RtpTransceiverDirection::kSendRecv) {
|
if (extension.uri != header_extensions_to_negotiate_[i].uri) {
|
||||||
|
return RTCError(RTCErrorType::INVALID_MODIFICATION,
|
||||||
|
"Reordering extensions is not allowed.");
|
||||||
|
}
|
||||||
|
if (IsMandatoryHeaderExtension(extension.uri) &&
|
||||||
|
extension.direction != RtpTransceiverDirection::kSendRecv) {
|
||||||
return RTCError(RTCErrorType::INVALID_MODIFICATION,
|
return RTCError(RTCErrorType::INVALID_MODIFICATION,
|
||||||
"Attempted to stop a mandatory extension.");
|
"Attempted to stop a mandatory extension.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(bugs.webrtc.org/7477): Currently there are no recvonly extensions so
|
||||||
|
// this can not be checked: "When there exists header extension capabilities
|
||||||
|
// that have directions other than kSendRecv, restrict extension.direction
|
||||||
|
// as to not exceed that capability."
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set all current extensions but the mandatory ones to stopped.
|
|
||||||
// This means that anything filtered from the input will not show up.
|
|
||||||
for (auto& entry : header_extensions_to_negotiate_) {
|
|
||||||
if (!IsMandatoryHeaderExtension(entry.uri)) {
|
|
||||||
entry.direction = RtpTransceiverDirection::kStopped;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Apply mutation after error checking.
|
// Apply mutation after error checking.
|
||||||
for (const auto& entry : header_extensions) {
|
for (size_t i = 0; i < header_extensions.size(); i++) {
|
||||||
auto it = std::find_if(
|
header_extensions_to_negotiate_[i].direction =
|
||||||
header_extensions_to_negotiate_.begin(),
|
header_extensions[i].direction;
|
||||||
header_extensions_to_negotiate_.end(),
|
|
||||||
[&entry](const auto& offered) { return entry.uri == offered.uri; });
|
|
||||||
it->direction = entry.direction;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return RTCError::OK();
|
return RTCError::OK();
|
||||||
|
|
|
@ -292,17 +292,47 @@ TEST_F(RtpTransceiverTestForHeaderExtensions, AcceptsStoppedExtension) {
|
||||||
modified_extensions);
|
modified_extensions);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsUnsupportedExtension) {
|
TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsDifferentSize) {
|
||||||
EXPECT_CALL(*receiver_.get(), Stop());
|
EXPECT_CALL(*receiver_.get(), Stop());
|
||||||
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
||||||
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
||||||
EXPECT_CALL(*sender_.get(), Stop());
|
EXPECT_CALL(*sender_.get(), Stop());
|
||||||
|
|
||||||
std::vector<RtpHeaderExtensionCapability> modified_extensions(
|
auto modified_extensions = extensions_;
|
||||||
{RtpHeaderExtensionCapability("uri3", 1,
|
modified_extensions.pop_back();
|
||||||
RtpTransceiverDirection::kSendRecv)});
|
|
||||||
EXPECT_THAT(transceiver_->SetHeaderExtensionsToNegotiate(modified_extensions),
|
EXPECT_THAT(transceiver_->SetHeaderExtensionsToNegotiate(modified_extensions),
|
||||||
Property(&RTCError::type, RTCErrorType::UNSUPPORTED_PARAMETER));
|
Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
|
||||||
|
EXPECT_EQ(transceiver_->GetHeaderExtensionsToNegotiate(), extensions_);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsChangedUri) {
|
||||||
|
EXPECT_CALL(*receiver_.get(), Stop());
|
||||||
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
||||||
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
||||||
|
EXPECT_CALL(*sender_.get(), Stop());
|
||||||
|
|
||||||
|
auto modified_extensions = extensions_;
|
||||||
|
ASSERT_TRUE(!modified_extensions.empty());
|
||||||
|
modified_extensions[0].uri = "http://webrtc.org";
|
||||||
|
|
||||||
|
EXPECT_THAT(transceiver_->SetHeaderExtensionsToNegotiate(modified_extensions),
|
||||||
|
Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
|
||||||
|
EXPECT_EQ(transceiver_->GetHeaderExtensionsToNegotiate(), extensions_);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RtpTransceiverTestForHeaderExtensions, RejectsReorder) {
|
||||||
|
EXPECT_CALL(*receiver_.get(), Stop());
|
||||||
|
EXPECT_CALL(*receiver_.get(), SetMediaChannel(_));
|
||||||
|
EXPECT_CALL(*sender_.get(), SetTransceiverAsStopped());
|
||||||
|
EXPECT_CALL(*sender_.get(), Stop());
|
||||||
|
|
||||||
|
auto modified_extensions = extensions_;
|
||||||
|
ASSERT_GE(modified_extensions.size(), 2u);
|
||||||
|
std::swap(modified_extensions[0], modified_extensions[1]);
|
||||||
|
|
||||||
|
EXPECT_THAT(transceiver_->SetHeaderExtensionsToNegotiate(modified_extensions),
|
||||||
|
Property(&RTCError::type, RTCErrorType::INVALID_MODIFICATION));
|
||||||
EXPECT_EQ(transceiver_->GetHeaderExtensionsToNegotiate(), extensions_);
|
EXPECT_EQ(transceiver_->GetHeaderExtensionsToNegotiate(), extensions_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue