Skip to content

Commit 4cb4f22

Browse files
authored
Merge pull request #814 from openmina/fix/p2p/webrtc/http_signal/cors
Fix WebRTC: avoid CORS issue by doing GET request instead of POST for signaling
2 parents bb40137 + 147f6d7 commit 4cb4f22

File tree

5 files changed

+60
-44
lines changed

5 files changed

+60
-44
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node/native/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ rand = "0.8"
1010
serde = "1.0.158"
1111
serde_json = "1.0.94"
1212
derive_more = "0.99.17"
13+
bs58 = { version = "0.4" }
1314
rayon = "1.5"
1415
tokio = { version = "1.26.0", features = ["process", "macros"] }
1516
reqwest = { version = "0.11.24", features = ["blocking", "json"] }

node/native/src/http_server.rs

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -39,48 +39,64 @@ pub async fn run(port: u16, rpc_sender: RpcSender) {
3939

4040
use super::rpc::RpcP2pConnectionIncomingResponse;
4141

42+
let handle = |sender: RpcSender, offer: Box<webrtc::Offer>| async move {
43+
let mut rx = sender
44+
.multishot_request(
45+
2,
46+
RpcRequest::P2pConnectionIncoming(P2pConnectionIncomingInitOpts {
47+
peer_id: PeerId::from_public_key(offer.identity_pub_key.clone()),
48+
signaling: IncomingSignalingMethod::Http,
49+
offer,
50+
}),
51+
)
52+
.await;
53+
54+
match rx.recv().await {
55+
Some(RpcP2pConnectionIncomingResponse::Answer(answer)) => {
56+
let status = match &answer {
57+
P2pConnectionResponse::Accepted(_) => StatusCode::OK,
58+
P2pConnectionResponse::Rejected(reason) => match reason.is_bad() {
59+
false => StatusCode::OK,
60+
true => StatusCode::BAD_REQUEST,
61+
},
62+
P2pConnectionResponse::SignalDecryptionFailed => StatusCode::BAD_REQUEST,
63+
P2pConnectionResponse::InternalError => StatusCode::INTERNAL_SERVER_ERROR,
64+
};
65+
with_json_reply(&answer, status)
66+
}
67+
_ => {
68+
let resp = P2pConnectionResponse::internal_error_str();
69+
with_json_reply(&resp, StatusCode::INTERNAL_SERVER_ERROR)
70+
}
71+
}
72+
};
73+
4274
let rpc_sender_clone = rpc_sender.clone();
43-
warp::path!("mina" / "webrtc" / "signal")
44-
.and(warp::post())
45-
.and(warp::filters::body::json())
46-
.then(move |offer: Box<webrtc::Offer>| {
75+
let get = warp::path!("mina" / "webrtc" / "signal" / String)
76+
.and(warp::get())
77+
.then(move |offer: String| {
4778
let rpc_sender_clone = rpc_sender_clone.clone();
4879
async move {
49-
let mut rx = rpc_sender_clone
50-
.multishot_request(
51-
2,
52-
RpcRequest::P2pConnectionIncoming(P2pConnectionIncomingInitOpts {
53-
peer_id: PeerId::from_public_key(offer.identity_pub_key.clone()),
54-
signaling: IncomingSignalingMethod::Http,
55-
offer,
56-
}),
57-
)
58-
.await;
59-
60-
match rx.recv().await {
61-
Some(RpcP2pConnectionIncomingResponse::Answer(answer)) => {
62-
let status = match &answer {
63-
P2pConnectionResponse::Accepted(_) => StatusCode::OK,
64-
P2pConnectionResponse::Rejected(reason) => match reason.is_bad() {
65-
false => StatusCode::OK,
66-
true => StatusCode::BAD_REQUEST,
67-
},
68-
P2pConnectionResponse::SignalDecryptionFailed => {
69-
StatusCode::BAD_REQUEST
70-
}
71-
P2pConnectionResponse::InternalError => {
72-
StatusCode::INTERNAL_SERVER_ERROR
73-
}
74-
};
75-
with_json_reply(&answer, status)
76-
}
77-
_ => {
78-
let resp = P2pConnectionResponse::internal_error_str();
79-
with_json_reply(&resp, StatusCode::INTERNAL_SERVER_ERROR)
80-
}
80+
let decode_res = Err(()).or_else(move |_| {
81+
let json = bs58::decode(&offer).into_vec().or(Err(()))?;
82+
serde_json::from_slice(&json).or(Err(()))
83+
});
84+
match decode_res {
85+
Err(()) => with_json_reply(
86+
&P2pConnectionResponse::SignalDecryptionFailed,
87+
StatusCode::BAD_REQUEST,
88+
),
89+
Ok(offer) => handle(rpc_sender_clone.clone(), offer).await,
8190
}
8291
}
83-
})
92+
});
93+
94+
let rpc_sender_clone = rpc_sender.clone();
95+
let post = warp::path!("mina" / "webrtc" / "signal")
96+
.and(warp::post())
97+
.and(warp::filters::body::json())
98+
.then(move |offer: Box<webrtc::Offer>| handle(rpc_sender_clone.clone(), offer));
99+
get.or(post)
84100
};
85101

86102
// TODO(binier): make endpoint only accessible locally.

node/web/src/node/builder.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,7 @@ impl NodeBuilder {
274274
}
275275

276276
fn default_peers() -> Vec<P2pConnectionOutgoingInitOpts> {
277-
["/2cBFzmUmkYgMUrxdv5S2Udyv8eiuhokAFS4WnYfHiAJLWoQ3yL9/http/webrtc3.webnode.openmina.com/3000",
278-
"/2aevrztkwUrbPDP85ZZHkNYM6qha2GYT9sUwPhttKAKzqQdF4nV/http/localhost/3000"]
277+
["/2cBFzmUmkYgMUrxdv5S2Udyv8eiuhokAFS4WnYfHiAJLWoQ3yL9/https/webrtc3.webnode.openmina.com/443"]
279278
.into_iter()
280279
.map(|s| s.parse().unwrap())
281280
.collect()

p2p/src/service_impl/webrtc/web.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,12 +234,11 @@ pub async fn webrtc_signal_send(
234234
url: &str,
235235
offer: Offer,
236236
) -> std::result::Result<P2pConnectionResponse, RTCSignalingError> {
237-
use web_sys::{Request, RequestInit, Response};
237+
use web_sys::{Request, Response};
238238

239-
let mut opts = RequestInit::new();
240-
opts.method("POST");
241-
opts.body(Some(&JsValue::from(serde_json::to_string(&offer)?)));
242-
let request = Request::new_with_str_and_init(url, &opts)?;
239+
let offer = bs58::encode(serde_json::to_string(&offer)?).into_string();
240+
let url = format!("{url}/{offer}");
241+
let request = Request::new_with_str(&url)?;
243242
request.headers().set("content-type", "application/json")?;
244243

245244
let window = web_sys::window().unwrap();

0 commit comments

Comments
 (0)