mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 20:01:08 +00:00
Offchain-worker: Make it possible to disable http support (#10087)
* Offchain-worker: Make it possible to disable http support If a chain doesn't require http support in its offchain workers, this pr enables them to disable the http support. * Switch to bitflags * Use Capabilities * Update client/offchain/src/lib.rs Co-authored-by: Tomasz Drwięga <tomusdrw@users.noreply.github.com> * Fix test * Update client/offchain/src/lib.rs Co-authored-by: Tomasz Drwięga <tomusdrw@users.noreply.github.com> Co-authored-by: Tomasz Drwięga <tomusdrw@users.noreply.github.com>
This commit is contained in:
@@ -34,6 +34,7 @@ use futures::{channel::mpsc, future, prelude::*};
|
||||
use hyper::{client, Body, Client as HyperClient};
|
||||
use hyper_rustls::HttpsConnector;
|
||||
use log::error;
|
||||
use once_cell::sync::Lazy;
|
||||
use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender};
|
||||
use sp_core::offchain::{HttpError, HttpRequestId, HttpRequestStatus, Timestamp};
|
||||
use std::{
|
||||
@@ -47,11 +48,13 @@ use std::{
|
||||
|
||||
/// Wrapper struct used for keeping the hyper_rustls client running.
|
||||
#[derive(Clone)]
|
||||
pub struct SharedClient(Arc<HyperClient<HttpsConnector<client::HttpConnector>, Body>>);
|
||||
pub struct SharedClient(Arc<Lazy<HyperClient<HttpsConnector<client::HttpConnector>, Body>>>);
|
||||
|
||||
impl SharedClient {
|
||||
pub fn new() -> Self {
|
||||
Self(Arc::new(HyperClient::builder().build(HttpsConnector::with_native_roots())))
|
||||
Self(Arc::new(Lazy::new(|| {
|
||||
HyperClient::builder().build(HttpsConnector::with_native_roots())
|
||||
})))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -567,7 +570,7 @@ pub struct HttpWorker {
|
||||
/// Used to receive messages from the `HttpApi`.
|
||||
from_api: TracingUnboundedReceiver<ApiToWorker>,
|
||||
/// The engine that runs HTTP requests.
|
||||
http_client: Arc<HyperClient<HttpsConnector<client::HttpConnector>, Body>>,
|
||||
http_client: Arc<Lazy<HyperClient<HttpsConnector<client::HttpConnector>, Body>>>,
|
||||
/// HTTP requests that are being worked on by the engine.
|
||||
requests: Vec<(HttpRequestId, HttpWorkerRequest)>,
|
||||
}
|
||||
@@ -697,12 +700,15 @@ impl fmt::Debug for HttpWorkerRequest {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{http, SharedClient};
|
||||
use super::{
|
||||
super::{tests::TestNetwork, AsyncApi},
|
||||
*,
|
||||
};
|
||||
use crate::api::timestamp;
|
||||
use core::convert::Infallible;
|
||||
use futures::{future, StreamExt};
|
||||
use lazy_static::lazy_static;
|
||||
use sp_core::offchain::{Duration, HttpError, HttpRequestId, HttpRequestStatus};
|
||||
use sp_core::offchain::{Duration, Externalities, HttpError, HttpRequestId, HttpRequestStatus};
|
||||
|
||||
// Using lazy_static to avoid spawning lots of different SharedClients,
|
||||
// as spawning a SharedClient is CPU-intensive and opens lots of fds.
|
||||
@@ -1006,4 +1012,37 @@ mod tests {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn shared_http_client_is_only_initialized_on_access() {
|
||||
let shared_client = SharedClient::new();
|
||||
|
||||
{
|
||||
let mock = Arc::new(TestNetwork());
|
||||
let (mut api, async_api) = AsyncApi::new(mock, false, shared_client.clone());
|
||||
api.timestamp();
|
||||
|
||||
futures::executor::block_on(async move {
|
||||
assert!(futures::poll!(async_api.process()).is_pending());
|
||||
});
|
||||
}
|
||||
|
||||
// Check that the http client wasn't initialized, because it wasn't used.
|
||||
assert!(Lazy::into_value(Arc::try_unwrap(shared_client.0).unwrap()).is_err());
|
||||
|
||||
let shared_client = SharedClient::new();
|
||||
|
||||
{
|
||||
let mock = Arc::new(TestNetwork());
|
||||
let (mut api, async_api) = AsyncApi::new(mock, false, shared_client.clone());
|
||||
let id = api.http_request_start("lol", "nope", &[]).unwrap();
|
||||
api.http_request_write_body(id, &[], None).unwrap();
|
||||
futures::executor::block_on(async move {
|
||||
assert!(futures::poll!(async_api.process()).is_pending());
|
||||
});
|
||||
}
|
||||
|
||||
// Check that the http client initialized, because it was used.
|
||||
assert!(Lazy::into_value(Arc::try_unwrap(shared_client.0).unwrap()).is_ok());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user