From 5622a12f3ea10c563c886484d4f67a1bedd4a679 Mon Sep 17 00:00:00 2001 From: Gaius Date: Thu, 6 Jul 2023 21:40:36 +0800 Subject: [PATCH] feat: add http client to download piece (#51) Signed-off-by: Gaius --- Cargo.toml | 2 ++ src/backend/http.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++ src/backend/mod.rs | 13 ++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/backend/http.rs diff --git a/Cargo.toml b/Cargo.toml index 2c745e34..6c200780 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,9 @@ opentelemetry-jaeger = { version = "0.17.0", features = ["rt-tokio"] } lazy_static = "1.4" prometheus = "0.13.3" warp = "0.3.5" +reqwest = "0.11.18" tokio = { version = "1.28.1", features = ["full"] } +bytes = "1.4" hostname = "^0.3" local-ip-address = "0.5.3" rocksdb = "0.21.0" diff --git a/src/backend/http.rs b/src/backend/http.rs new file mode 100644 index 00000000..69867100 --- /dev/null +++ b/src/backend/http.rs @@ -0,0 +1,60 @@ +/* + * Copyright 2023 The Dragonfly Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use bytes::Bytes; +use reqwest::header::HeaderMap; +use std::time::Duration; + +// Request is the request for HTTP backend. +pub struct Request { + // url is the url of the request. + pub url: String, + // header is the headers of the request. + pub header: HeaderMap, + // timeout is the timeout of the request. + pub timeout: Option, +} + +// Response is the response for HTTP backend. +pub struct Response { + // header is the headers of the response. + pub header: HeaderMap, + // status_code is the status code of the response. + pub status_code: reqwest::StatusCode, + // body is the content of the response. + pub body: Bytes, +} + +// HTTP is the HTTP backend. +pub struct HTTP {} + +// HTTP implements the http interface. +impl HTTP { + // Get gets the content of the request. + pub async fn get(&self, req: Request) -> super::Result { + let mut request_builder = reqwest::Client::new().get(&req.url).headers(req.header); + if let Some(timeout) = req.timeout { + request_builder = request_builder.timeout(timeout); + } + + let response = request_builder.send().await?; + Ok(Response { + header: response.headers().clone(), + status_code: response.status(), + body: response.bytes().await?, + }) + } +} diff --git a/src/backend/mod.rs b/src/backend/mod.rs index c81dd8ba..94b4b96c 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -13,3 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +pub mod http; + +// Error is the error for Backend. +#[derive(Debug, thiserror::Error)] +pub enum Error { + // Reqwest is the error for reqwest. + #[error(transparent)] + Reqwest(#[from] reqwest::Error), +} + +// Result is the result for Backend. +pub type Result = std::result::Result;