use async_trait::async_trait;
use clap::Parser;
use pingora_core::server::Server;
use pingora_core::upstreams::peer::HttpPeer;
use pingora_core::Result;
use pingora_core::{
modules::http::{
grpc_web::{GrpcWeb, GrpcWebBridge},
HttpModules,
},
prelude::Opt,
};
use pingora_proxy::{ProxyHttp, Session};
pub struct GrpcWebBridgeProxy;
#[async_trait]
impl ProxyHttp for GrpcWebBridgeProxy {
type CTX = ();
fn new_ctx(&self) -> Self::CTX {}
fn init_downstream_modules(&self, modules: &mut HttpModules) {
modules.add_module(Box::new(GrpcWeb))
}
async fn early_request_filter(
&self,
session: &mut Session,
_ctx: &mut Self::CTX,
) -> Result<()> {
let grpc = session
.downstream_modules_ctx
.get_mut::<GrpcWebBridge>()
.expect("GrpcWebBridge module added");
grpc.init();
Ok(())
}
async fn upstream_peer(
&self,
_session: &mut Session,
_ctx: &mut Self::CTX,
) -> Result<Box<HttpPeer>> {
let grpc_peer = Box::new(HttpPeer::new(
("1.1.1.1", 443),
true,
"one.one.one.one".to_string(),
));
Ok(grpc_peer)
}
}
fn main() {
env_logger::init();
let opt = Opt::parse();
let mut my_server = Server::new(Some(opt)).unwrap();
my_server.bootstrap();
let mut my_proxy =
pingora_proxy::http_proxy_service(&my_server.configuration, GrpcWebBridgeProxy);
my_proxy.add_tcp("0.0.0.0:6194");
my_server.add_service(my_proxy);
my_server.run_forever();
}