[StunRequest] Remove Construct and Prepare methods.
Construction in StunRequest and derived classes now happens in
the ctor.
Bug: none
Change-Id: I803f6fd2b6d0ac1d9426304d1e1de10dec855eed
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/264942
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37126}
diff --git a/p2p/base/stun_port.cc b/p2p/base/stun_port.cc
index e846194..e1a6820 100644
--- a/p2p/base/stun_port.cc
+++ b/p2p/base/stun_port.cc
@@ -40,17 +40,14 @@
StunBindingRequest(UDPPort* port,
const rtc::SocketAddress& addr,
int64_t start_time)
- : StunRequest(port->request_manager()),
+ : StunRequest(port->request_manager(),
+ std::make_unique<StunMessage>(STUN_BINDING_REQUEST)),
port_(port),
server_addr_(addr),
start_time_(start_time) {}
const rtc::SocketAddress& server_addr() const { return server_addr_; }
- void Prepare(StunMessage* message) override {
- message->SetType(STUN_BINDING_REQUEST);
- }
-
void OnResponse(StunMessage* response) override {
const StunAddressAttribute* addr_attr =
response->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
diff --git a/p2p/base/stun_request.cc b/p2p/base/stun_request.cc
index 868db4c..2a1ad65 100644
--- a/p2p/base/stun_request.cc
+++ b/p2p/base/stun_request.cc
@@ -57,7 +57,6 @@
void StunRequestManager::SendDelayed(StunRequest* request, int delay) {
RTC_DCHECK_RUN_ON(thread_);
RTC_DCHECK_EQ(this, request->manager());
- request->Construct();
auto [iter, was_inserted] =
requests_.emplace(request->id(), absl::WrapUnique(request));
RTC_DCHECK(was_inserted);
@@ -212,18 +211,6 @@
manager_.network_thread()->Clear(this);
}
-void StunRequest::Construct() {
- // TODO(tommi): The implementation assumes that Construct() is only called
- // once (see `StunRequestManager::SendDelayed` below). However, these steps to
- // construct a request object are odd to have at this level (virtual method
- // called from the parent class, _after_ construction) and also triggered
- // from a different class... via a "Send" method.
- // Remove `Prepare`, `Construct` and make construction of the message objects
- // separate from the StunRequest and StunRequestManager classes.
- Prepare(msg_.get());
- RTC_DCHECK_NE(msg_->type(), 0);
-}
-
int StunRequest::type() {
RTC_DCHECK(msg_ != NULL);
return msg_->type();
diff --git a/p2p/base/stun_request.h b/p2p/base/stun_request.h
index 94fc98f..c6d1076 100644
--- a/p2p/base/stun_request.h
+++ b/p2p/base/stun_request.h
@@ -114,14 +114,7 @@
protected:
friend class StunRequestManager;
- // Causes our wrapped StunMessage to be Prepared.
- // Only called by StunRequestManager.
- // TODO(tommi): get rid of this (see cc file).
- void Construct();
-
- // Fills in a request object to be sent. Note that request's transaction ID
- // will already be set and cannot be changed.
- virtual void Prepare(StunMessage* message) {}
+ StunMessage* mutable_msg() { return msg_.get(); }
// Called when the message receives a response or times out.
virtual void OnResponse(StunMessage* response) {}
diff --git a/p2p/base/stun_request_unittest.cc b/p2p/base/stun_request_unittest.cc
index 99847f8..6831d9f 100644
--- a/p2p/base/stun_request_unittest.cc
+++ b/p2p/base/stun_request_unittest.cc
@@ -77,16 +77,9 @@
// Forwards results to the test class.
class StunRequestThunker : public StunRequest {
public:
- StunRequestThunker(StunRequestManager& manager,
- StunMessageType message_type,
- StunRequestTest* test)
- : StunRequest(manager, CreateStunMessage(message_type)), test_(test) {
- Construct(); // Triggers a call to `Prepare()` which sets the type.
- }
StunRequestThunker(StunRequestManager& manager, StunRequestTest* test)
- : StunRequest(manager), test_(test) {
- Construct(); // Triggers a call to `Prepare()` which sets the type.
- }
+ : StunRequest(manager, CreateStunMessage(STUN_BINDING_REQUEST)),
+ test_(test) {}
std::unique_ptr<StunMessage> CreateResponseMessage(StunMessageType type) {
return CreateStunMessage(type, msg());
@@ -99,16 +92,12 @@
}
virtual void OnTimeout() { test_->OnTimeout(); }
- virtual void Prepare(StunMessage* message) {
- message->SetType(STUN_BINDING_REQUEST);
- }
-
StunRequestTest* test_;
};
// Test handling of a normal binding response.
TEST_F(StunRequestTest, TestSuccess) {
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res =
request->CreateResponseMessage(STUN_BINDING_RESPONSE);
manager_.Send(request);
@@ -122,7 +111,7 @@
// Test handling of an error binding response.
TEST_F(StunRequestTest, TestError) {
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res =
request->CreateResponseMessage(STUN_BINDING_ERROR_RESPONSE);
manager_.Send(request);
@@ -136,7 +125,7 @@
// Test handling of a binding response with the wrong transaction id.
TEST_F(StunRequestTest, TestUnexpected) {
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res = CreateStunMessage(STUN_BINDING_RESPONSE);
manager_.Send(request);
@@ -151,7 +140,7 @@
// Test that requests are sent at the right times.
TEST_F(StunRequestTest, TestBackoff) {
rtc::ScopedFakeClock fake_clock;
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res =
request->CreateResponseMessage(STUN_BINDING_RESPONSE);
@@ -176,7 +165,7 @@
// Test that we timeout properly if no response is received.
TEST_F(StunRequestTest, TestTimeout) {
rtc::ScopedFakeClock fake_clock;
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res =
request->CreateResponseMessage(STUN_BINDING_RESPONSE);
@@ -213,7 +202,7 @@
// which is not recognized, the transaction should be considered a failure and
// the response should be ignored.
TEST_F(StunRequestTest, TestUnrecognizedComprehensionRequiredAttribute) {
- auto* request = new StunRequestThunker(manager_, STUN_BINDING_REQUEST, this);
+ auto* request = new StunRequestThunker(manager_, this);
std::unique_ptr<StunMessage> res =
request->CreateResponseMessage(STUN_BINDING_ERROR_RESPONSE);
diff --git a/p2p/base/turn_port.cc b/p2p/base/turn_port.cc
index 148fc6b..6cb3da4 100644
--- a/p2p/base/turn_port.cc
+++ b/p2p/base/turn_port.cc
@@ -73,7 +73,6 @@
class TurnAllocateRequest : public StunRequest {
public:
explicit TurnAllocateRequest(TurnPort* port);
- void Prepare(StunMessage* message) override;
void OnSent() override;
void OnResponse(StunMessage* response) override;
void OnErrorResponse(StunMessage* response) override;
@@ -90,17 +89,14 @@
class TurnRefreshRequest : public StunRequest {
public:
- explicit TurnRefreshRequest(TurnPort* port);
- void Prepare(StunMessage* message) override;
+ explicit TurnRefreshRequest(TurnPort* port, int lifetime = -1);
void OnSent() override;
void OnResponse(StunMessage* response) override;
void OnErrorResponse(StunMessage* response) override;
void OnTimeout() override;
- void set_lifetime(int lifetime) { lifetime_ = lifetime; }
private:
TurnPort* port_;
- int lifetime_;
};
class TurnCreatePermissionRequest : public StunRequest,
@@ -110,7 +106,6 @@
TurnEntry* entry,
const rtc::SocketAddress& ext_addr,
const std::string& remote_ufrag);
- void Prepare(StunMessage* message) override;
void OnSent() override;
void OnResponse(StunMessage* response) override;
void OnErrorResponse(StunMessage* response) override;
@@ -131,7 +126,6 @@
TurnEntry* entry,
int channel_id,
const rtc::SocketAddress& ext_addr);
- void Prepare(StunMessage* message) override;
void OnSent() override;
void OnResponse(StunMessage* response) override;
void OnErrorResponse(StunMessage* response) override;
@@ -933,8 +927,7 @@
request_manager_.Clear();
// Send refresh with lifetime 0.
- TurnRefreshRequest* req = new TurnRefreshRequest(this);
- req->set_lifetime(0);
+ TurnRefreshRequest* req = new TurnRefreshRequest(this, 0);
SendRequest(req, 0);
state_ = STATE_RECEIVEONLY;
@@ -1376,9 +1369,8 @@
TurnAllocateRequest::TurnAllocateRequest(TurnPort* port)
: StunRequest(port->request_manager(),
std::make_unique<TurnMessage>(TURN_ALLOCATE_REQUEST)),
- port_(port) {}
-
-void TurnAllocateRequest::Prepare(StunMessage* message) {
+ port_(port) {
+ StunMessage* message = mutable_msg();
// Create the request as indicated in RFC 5766, Section 6.1.
RTC_DCHECK_EQ(message->type(), TURN_ALLOCATE_REQUEST);
auto transport_attr =
@@ -1563,19 +1555,17 @@
TurnPort::MSG_TRY_ALTERNATE_SERVER);
}
-TurnRefreshRequest::TurnRefreshRequest(TurnPort* port)
+TurnRefreshRequest::TurnRefreshRequest(TurnPort* port, int lifetime /*= -1*/)
: StunRequest(port->request_manager(),
std::make_unique<TurnMessage>(TURN_REFRESH_REQUEST)),
- port_(port),
- lifetime_(-1) {}
-
-void TurnRefreshRequest::Prepare(StunMessage* message) {
+ port_(port) {
+ StunMessage* message = mutable_msg();
// Create the request as indicated in RFC 5766, Section 7.1.
// No attributes need to be included.
RTC_DCHECK_EQ(message->type(), TURN_REFRESH_REQUEST);
- if (lifetime_ > -1) {
+ if (lifetime > -1) {
message->AddAttribute(
- std::make_unique<StunUInt32Attribute>(STUN_ATTR_LIFETIME, lifetime_));
+ std::make_unique<StunUInt32Attribute>(STUN_ATTR_LIFETIME, lifetime));
}
port_->AddRequestAuthInfo(message);
@@ -1657,9 +1647,7 @@
remote_ufrag_(remote_ufrag) {
entry_->SignalDestroyed.connect(
this, &TurnCreatePermissionRequest::OnEntryDestroyed);
-}
-
-void TurnCreatePermissionRequest::Prepare(StunMessage* message) {
+ StunMessage* message = mutable_msg();
// Create the request as indicated in RFC5766, Section 9.1.
message->SetType(TURN_CREATE_PERMISSION_REQUEST);
message->AddAttribute(std::make_unique<StunXorAddressAttribute>(
@@ -1731,9 +1719,7 @@
ext_addr_(ext_addr) {
entry_->SignalDestroyed.connect(this,
&TurnChannelBindRequest::OnEntryDestroyed);
-}
-
-void TurnChannelBindRequest::Prepare(StunMessage* message) {
+ StunMessage* message = mutable_msg();
// Create the request as indicated in RFC5766, Section 11.1.
RTC_DCHECK_EQ(message->type(), TURN_CHANNEL_BIND_REQUEST);
message->AddAttribute(std::make_unique<StunUInt32Attribute>(