1
- use anyhow:: Result ;
1
+ use anyhow:: { Result , Error } ;
2
2
use futures_util:: future:: OptionFuture ;
3
- use futures_util:: { FutureExt , TryStreamExt } ;
3
+ use futures_util:: stream:: { BoxStream , Stream } ;
4
+ use futures_util:: { FutureExt , StreamExt , TryStreamExt } ;
5
+ use metrics:: { metrics, metrics_wrapper} ;
4
6
use sqlx:: PgPool ;
7
+ use tokio:: io:: { Error as IoError , Result as IoResult } ;
5
8
use tokio:: net:: TcpListener ;
6
9
use tokio:: net:: ToSocketAddrs ;
7
10
use tokio_stream:: wrappers:: TcpListenerStream ;
8
11
use tracing:: { debug_span, info} ;
9
- use tracing_futures:: Instrument ;
10
12
11
- use metrics :: { metrics , metrics_wrapper } ;
12
- use proxy :: ProxyStream ;
13
+ use crate :: api :: proxy :: { PeerAddr , ProxyStream } ;
14
+ use futures_util :: io :: { AsyncRead , AsyncWrite } ;
13
15
14
16
mod metrics;
15
17
mod proxy;
16
18
mod routes;
17
19
mod tls;
18
20
19
- pub struct Api {
20
- http : Option < TcpListenerStream > ,
21
- https : Option < TcpListenerStream > ,
22
- prom : Option < TcpListenerStream > ,
21
+ type Connection = Box < dyn PeerAddr < IoError > + Send + Unpin + ' static > ;
22
+ type Listener = BoxStream < ' static , IoResult < Connection > > ;
23
+
24
+ pub struct Api < H , S > {
25
+ http : Option < H > ,
26
+ https : Option < S > ,
27
+ prom : Option < H > ,
23
28
pool : PgPool ,
24
29
}
25
30
26
- impl Api {
31
+ impl < H , S > Api < H , S > {
32
+ fn prepare_listener ( listener : TcpListener , proxy : bool ) -> Listener {
33
+ let listener = match listener {
34
+ Some ( listener) => TcpListenerStream :: new ( listener) ,
35
+ None => return None ,
36
+ } ;
37
+
38
+ let mapper = match proxy {
39
+ true => |stream| Box :: new ( ProxyStream :: from ( stream) ) as Connection ,
40
+ false => |stream| Box :: new ( stream) as Connection
41
+ } ;
42
+
43
+ let listener = listener
44
+ . map_ok ( mapper)
45
+ . boxed ( ) ;
46
+
47
+ Some ( listener)
48
+ }
49
+
27
50
pub async fn new < A : ToSocketAddrs > (
28
- http : Option < A > ,
29
- https : Option < A > ,
30
- prom : Option < A > ,
51
+ ( http, http_proxy ) : ( Option < A > , bool ) ,
52
+ ( https, https_proxy ) : ( Option < A > , bool ) ,
53
+ ( prom, prom_proxy ) : ( Option < A > , bool ) ,
31
54
pool : PgPool ,
32
- ) -> Result < Self > {
55
+ ) -> Result < Api <
56
+ impl Stream < Item = IoResult < impl AsyncRead + AsyncWrite + Send + Unpin + ' static > > + Send ,
57
+ impl Stream < Item = Result < impl AsyncRead + AsyncWrite + Send + Unpin + ' static , Error > > + Send
58
+ > > {
33
59
let http = OptionFuture :: from ( http. map ( TcpListener :: bind) ) . map ( Option :: transpose) ;
34
60
let https = OptionFuture :: from ( https. map ( TcpListener :: bind) ) . map ( Option :: transpose) ;
35
61
let prom = OptionFuture :: from ( prom. map ( TcpListener :: bind) ) . map ( Option :: transpose) ;
36
62
37
63
let ( http, https, prom) = tokio:: try_join!( http, https, prom) ?;
38
64
65
+ let http = Api :: prepare_listener ( http, http_proxy) ;
66
+ let https = Api :: prepare_listener ( https, https_proxy) ;
67
+ let prom = Api :: prepare_listener ( prom, prom_proxy) ;
68
+
39
69
Ok ( Api {
40
- http : http. map ( TcpListenerStream :: new ) ,
41
- https : https. map ( TcpListenerStream :: new ) ,
42
- prom : prom. map ( TcpListenerStream :: new ) ,
70
+ http : proxy :: wrap ( http) . try_buffer_unordered ( 100 ) ,
71
+ https : tls :: stream ( https, pool . clone ( ) ) ,
72
+ prom : proxy :: wrap ( prom) . try_buffer_unordered ( 100 ) ,
43
73
pool,
44
74
} )
45
75
}
@@ -52,31 +82,29 @@ impl Api {
52
82
53
83
let http = self
54
84
. http
55
- . map ( |http| {
56
- let addr = http. as_ref ( ) . local_addr ( ) ;
57
- proxy:: wrap ( http. map_ok ( ProxyStream :: from) )
58
- . try_buffer_unordered ( 100 )
59
- . instrument ( debug_span ! ( "HTTP" , local. addr = ?addr) )
60
- } )
85
+ . map ( |http|
86
+ proxy:: wrap ( http) . try_buffer_unordered ( 100 )
87
+ )
61
88
. map ( |http| warp:: serve ( routes. clone ( ) ) . serve_incoming ( http) )
62
89
. map ( tokio:: spawn) ;
63
90
64
91
let pool = self . pool . clone ( ) ;
65
92
let https = self
66
93
. https
67
94
. map ( |https| {
68
- let addr = https. as_ref ( ) . local_addr ( ) ;
69
- let https = https . map_ok ( ProxyStream :: from ) ;
70
- tls :: stream ( https , pool ) . instrument ( debug_span ! ( "HTTPS" , local. addr = ?addr) )
95
+ // let addr = https.as_ref().local_addr();
96
+ tls :: stream ( https , pool )
97
+ // .instrument(debug_span!("HTTPS", local.addr = ?addr))
71
98
} )
72
99
. map ( |https| warp:: serve ( routes) . serve_incoming ( https) )
73
100
. map ( tokio:: spawn) ;
74
101
75
102
let prom = self
76
103
. prom
77
104
. map ( |prom| {
78
- let addr = prom. as_ref ( ) . local_addr ( ) ;
79
- prom. instrument ( debug_span ! ( "PROM" , local. addr = ?addr) )
105
+ //let addr = prom.as_ref().local_addr();
106
+ prom
107
+ //.instrument(debug_span!("PROM", local.addr = ?addr))
80
108
} )
81
109
. map ( |prom| warp:: serve ( metrics ( ) ) . serve_incoming ( prom) )
82
110
. map ( tokio:: spawn) ;
0 commit comments