1
- use hyper:: { Body , Error , Method , Server , Version } ;
1
+ use hyper:: { Body , Method , StatusCode , Error } ;
2
2
use hyper:: http:: Response ;
3
- use hyper:: service:: { make_service_fn, service_fn} ;
3
+ use hyper:: server:: conn:: Http ;
4
+ use hyper:: service:: service_fn;
4
5
use rmp:: encode;
5
6
use rmp:: encode:: ByteBuf ;
6
7
use serde:: Deserialize ;
7
8
use serde_json:: Value ;
8
9
use std:: collections:: HashMap ;
10
+ use std:: net:: SocketAddr ;
11
+ use tokio:: net:: TcpListener ;
9
12
use tokio:: sync:: mpsc;
10
13
use tokio:: sync:: mpsc:: { Receiver , Sender } ;
11
14
@@ -46,7 +49,8 @@ struct Payload {
46
49
}
47
50
48
51
// TODO: Decouple processing from transport.
49
- // TODO: Cleanup traces on connection close.
52
+ // TODO: Stream the data somehow.
53
+ // TODO: Make sure that traces are cleaned up on connection close.
50
54
// TODO: Read MsgPack manually and copy bytes to span buffer directly.
51
55
// TODO: Add support for more payload metadata (i.e. language).
52
56
// TODO: Use string table.
@@ -62,8 +66,11 @@ struct Payload {
62
66
63
67
#[ tokio:: main]
64
68
async fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error + Send + Sync > > {
65
- let addr = ( [ 127 , 0 , 0 , 1 ] , 8127 ) . into ( ) ;
66
- let make_svc = make_service_fn ( |_conn| {
69
+ let addr = SocketAddr :: from ( ( [ 127 , 0 , 0 , 1 ] , 8127 ) ) ;
70
+ let listener = TcpListener :: bind ( addr) . await ?;
71
+
72
+ loop {
73
+ let ( stream, _) = listener. accept ( ) . await ?;
67
74
let ( tx, mut rx) : ( Sender < Payload > , Receiver < Payload > ) = mpsc:: channel ( 100 ) ;
68
75
69
76
tokio:: spawn ( async move {
@@ -83,38 +90,37 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
83
90
}
84
91
} ) ;
85
92
86
- async move {
87
- Ok :: < _ , Error > ( service_fn ( move |mut req| {
88
- let tx = tx. clone ( ) ;
89
-
90
- async move {
91
- let method = req. method ( ) ;
92
- let path = req. uri ( ) . path ( ) ;
93
- let version = req. version ( ) ;
94
-
95
- if version == Version :: HTTP_11 && method == Method :: PUT && path == "/v0.1/events" {
96
- let bytes = hyper:: body:: to_bytes ( req. body_mut ( ) ) . await . unwrap ( ) ;
97
- let data: Vec < u8 > = bytes. try_into ( ) . unwrap ( ) ;
98
- let payload: Payload = rmp_serde:: from_slice ( & data) . unwrap ( ) ;
99
-
100
- tx. send ( payload) . await . unwrap ( ) ;
101
-
102
- Ok ( Response :: new ( Body :: from ( "" ) ) )
103
- } else {
104
- Err ( "Unsupported request" ) // TODO: not a 500
93
+ tokio:: spawn ( async move {
94
+ Http :: new ( )
95
+ . http1_only ( true )
96
+ . http1_keep_alive ( true )
97
+ . serve_connection ( stream, service_fn ( move |mut req| {
98
+ let tx = tx. clone ( ) ;
99
+
100
+ async move {
101
+ let method = req. method ( ) ;
102
+ let path = req. uri ( ) . path ( ) ;
103
+ let body;
104
+
105
+ if method == Method :: PUT && path == "/v0.1/events" {
106
+ let bytes = hyper:: body:: to_bytes ( req. body_mut ( ) ) . await . unwrap ( ) ;
107
+ let data: Vec < u8 > = bytes. try_into ( ) . unwrap ( ) ;
108
+ let payload: Payload = rmp_serde:: from_slice ( & data) . unwrap ( ) ;
109
+
110
+ tx. send ( payload) . await . unwrap ( ) ;
111
+
112
+ body = Response :: new ( Body :: from ( "" ) ) ;
113
+ } else {
114
+ body = Response :: builder ( ) . status ( StatusCode :: NOT_FOUND ) . body ( Body :: from ( "" ) ) . unwrap ( )
115
+ }
116
+
117
+ Ok :: < _ , Error > ( body)
105
118
}
106
- }
107
- } ) )
108
- }
109
- } ) ;
110
-
111
- let server = Server :: bind ( & addr) . serve ( make_svc) ;
112
-
113
- println ! ( "Listening on http://{}" , addr) ;
114
-
115
- server. await ?;
116
-
117
- Ok ( ( ) )
119
+ } ) )
120
+ . await
121
+ . unwrap ( ) ;
122
+ } ) ;
123
+ }
118
124
}
119
125
120
126
fn process_event ( traces : & mut Traces , event : Value , metadata : & Metadata ) {
0 commit comments