feat: add http client to download piece (#51)

Signed-off-by: Gaius <gaius.qi@gmail.com>
This commit is contained in:
Gaius 2023-07-06 21:40:36 +08:00 committed by GitHub
parent 583fd05c7d
commit 5622a12f3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 75 additions and 0 deletions

View File

@ -41,7 +41,9 @@ opentelemetry-jaeger = { version = "0.17.0", features = ["rt-tokio"] }
lazy_static = "1.4" lazy_static = "1.4"
prometheus = "0.13.3" prometheus = "0.13.3"
warp = "0.3.5" warp = "0.3.5"
reqwest = "0.11.18"
tokio = { version = "1.28.1", features = ["full"] } tokio = { version = "1.28.1", features = ["full"] }
bytes = "1.4"
hostname = "^0.3" hostname = "^0.3"
local-ip-address = "0.5.3" local-ip-address = "0.5.3"
rocksdb = "0.21.0" rocksdb = "0.21.0"

60
src/backend/http.rs Normal file
View File

@ -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<Duration>,
}
// 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<Response> {
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?,
})
}
}

View File

@ -13,3 +13,16 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * 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<T> = std::result::Result<T, Error>;