101 lines · 2.7 KB · Rust
RawDownload
//! An HTTP client. pub use crate::wit::zed::extension::http_client::{    HttpMethod, HttpRequest, HttpResponse, HttpResponseStream, RedirectPolicy, fetch, fetch_stream,}; impl HttpRequest {    /// Returns a builder for an [`HttpRequest`].    pub fn builder() -> HttpRequestBuilder {        HttpRequestBuilder::new()    }     /// Executes the [`HttpRequest`] with [`fetch`].    pub fn fetch(&self) -> Result<HttpResponse, String> {        fetch(self)    }     /// Executes the [`HttpRequest`] with [`fetch_stream`].    pub fn fetch_stream(&self) -> Result<HttpResponseStream, String> {        fetch_stream(self)    }} /// A builder for an [`HttpRequest`].#[derive(Clone)]pub struct HttpRequestBuilder {    method: Option<HttpMethod>,    url: Option<String>,    headers: Vec<(String, String)>,    body: Option<Vec<u8>>,    redirect_policy: RedirectPolicy,} impl Default for HttpRequestBuilder {    fn default() -> Self {        Self::new()    }} impl HttpRequestBuilder {    /// Returns a new [`HttpRequestBuilder`].    pub fn new() -> Self {        HttpRequestBuilder {            method: None,            url: None,            headers: Vec::new(),            body: None,            redirect_policy: RedirectPolicy::NoFollow,        }    }     /// Sets the HTTP method for the request.    pub fn method(mut self, method: HttpMethod) -> Self {        self.method = Some(method);        self    }     /// Sets the URL for the request.    pub fn url(mut self, url: impl Into<String>) -> Self {        self.url = Some(url.into());        self    }     /// Adds a header to the request.    pub fn header(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {        self.headers.push((name.into(), value.into()));        self    }     /// Adds the specified headers to the request.    pub fn headers(mut self, headers: impl IntoIterator<Item = (String, String)>) -> Self {        self.headers.extend(headers);        self    }     /// Sets the body of the request.    pub fn body(mut self, body: impl Into<Vec<u8>>) -> Self {        self.body = Some(body.into());        self    }     /// Sets the redirect policy for the request.    pub fn redirect_policy(mut self, policy: RedirectPolicy) -> Self {        self.redirect_policy = policy;        self    }     /// Builds the [`HttpRequest`].    pub fn build(self) -> Result<HttpRequest, String> {        let method = self.method.ok_or_else(|| "Method not set".to_string())?;        let url = self.url.ok_or_else(|| "URL not set".to_string())?;         Ok(HttpRequest {            method,            url,            headers: self.headers,            body: self.body,            redirect_policy: self.redirect_policy,        })    }}