wasi_net/ws/
socket_builder.rs

1#![allow(dead_code)]
2use std::io::Write;
3
4use super::*;
5use crate::backend::utils::*;
6use crate::backend::*;
7
8pub struct SocketBuilder {
9    pub(crate) url: url::Url,
10}
11
12impl SocketBuilder {
13    pub fn new(url: url::Url) -> SocketBuilder {
14        SocketBuilder { url }
15    }
16
17    pub fn open(self) -> Result<WebSocket, std::io::Error> {
18        let url = self.url.to_string();
19
20        let submit = Command::WebSocketVersion1 { url };
21        let mut submit = submit.serialize()?;
22        submit += "\n";
23
24        let mut file = std::fs::File::open("/dev/web")?;
25
26        let _ = file.write_all(submit.as_bytes());
27
28        let res = read_response(&mut file)?;
29        match res {
30            Response::Error { msg } => {
31                return Err(std::io::Error::new(std::io::ErrorKind::Other, msg.as_str()));
32            }
33            Response::WebSocketVersion1 { .. } => {}
34            Response::WebRequestVersion1 { .. } => {
35                return Err(std::io::Error::new(
36                    std::io::ErrorKind::Other,
37                    "server returned a web response instead of a web socket",
38                ));
39            }
40            _ => {
41                return Err(std::io::Error::new(
42                    std::io::ErrorKind::Other,
43                    "the socket does not support this response type",
44                ));
45            }
46        };
47
48        Ok(WebSocket { file })
49    }
50}