1
1
use std:: {
2
+ fmt,
2
3
future:: Future ,
3
4
io, mem,
4
5
pin:: Pin ,
@@ -7,32 +8,25 @@ use std::{
7
8
} ;
8
9
9
10
use actix_rt:: { self as rt, net:: TcpStream , time:: sleep, System } ;
11
+ use actix_service:: ServiceFactory ;
10
12
use log:: { error, info} ;
11
13
use tokio:: sync:: {
12
14
mpsc:: { unbounded_channel, UnboundedReceiver } ,
13
15
oneshot,
14
16
} ;
15
17
16
- use crate :: accept:: AcceptLoop ;
17
- use crate :: join_all;
18
- use crate :: server:: { ServerCommand , ServerHandle } ;
19
- use crate :: service:: { InternalServiceFactory , ServiceFactory , StreamNewService } ;
20
- use crate :: signals:: { Signal , Signals } ;
21
- use crate :: socket:: { MioListener , StdSocketAddr , StdTcpListener , ToSocketAddrs } ;
22
- use crate :: socket:: { MioTcpListener , MioTcpSocket } ;
23
- use crate :: waker_queue:: { WakerInterest , WakerQueue } ;
24
- use crate :: worker:: { ServerWorker , ServerWorkerConfig , WorkerHandleAccept , WorkerHandleServer } ;
25
-
26
- #[ derive( Debug ) ]
27
- #[ non_exhaustive]
28
- pub struct Server ;
29
-
30
- impl Server {
31
- /// Start server building process.
32
- pub fn build ( ) -> ServerBuilder {
33
- ServerBuilder :: default ( )
34
- }
35
- }
18
+ use crate :: {
19
+ accept:: AcceptLoop ,
20
+ join_all,
21
+ server:: { ServerCommand , ServerHandle } ,
22
+ service:: { InternalServiceFactory , StreamNewService } ,
23
+ signals:: { Signal , Signals } ,
24
+ socket:: {
25
+ MioListener , MioTcpListener , MioTcpSocket , StdSocketAddr , StdTcpListener , ToSocketAddrs ,
26
+ } ,
27
+ waker_queue:: { WakerInterest , WakerQueue } ,
28
+ worker:: { ServerWorker , ServerWorkerConfig , WorkerHandleAccept , WorkerHandleServer } ,
29
+ } ;
36
30
37
31
/// Server builder
38
32
pub struct ServerBuilder {
@@ -169,38 +163,48 @@ impl ServerBuilder {
169
163
/// Binds to all network interface addresses that resolve from the `addr` argument.
170
164
/// Eg. using `localhost` might bind to both IPv4 and IPv6 addresses. Bind to multiple distinct
171
165
/// interfaces at the same time by passing a list of socket addresses.
172
- pub fn bind < F , U , N : AsRef < str > > ( mut self , name : N , addr : U , factory : F ) -> io:: Result < Self >
166
+ pub fn bind < F , U , InitErr > (
167
+ mut self ,
168
+ name : impl AsRef < str > ,
169
+ addr : U ,
170
+ factory : F ,
171
+ ) -> io:: Result < Self >
173
172
where
174
- F : ServiceFactory < TcpStream > ,
173
+ F : ServiceFactory < TcpStream , Config = ( ) , InitError = InitErr > + Send + Clone + ' static ,
174
+ InitErr : fmt:: Debug + Send + ' static ,
175
175
U : ToSocketAddrs ,
176
176
{
177
177
let sockets = bind_addr ( addr, self . backlog ) ?;
178
178
179
179
for lst in sockets {
180
180
let token = self . next_token ( ) ;
181
+
181
182
self . services . push ( StreamNewService :: create (
182
183
name. as_ref ( ) . to_string ( ) ,
183
184
token,
184
185
factory. clone ( ) ,
185
186
lst. local_addr ( ) ?,
186
187
) ) ;
188
+
187
189
self . sockets
188
190
. push ( ( token, name. as_ref ( ) . to_string ( ) , MioListener :: Tcp ( lst) ) ) ;
189
191
}
192
+
190
193
Ok ( self )
191
194
}
192
195
193
196
/// Bind server to existing TCP listener.
194
197
///
195
198
/// Useful when running as a systemd service and a socket FD can be passed to the process.
196
- pub fn listen < F , N : AsRef < str > > (
199
+ pub fn listen < F , InitErr > (
197
200
mut self ,
198
- name : N ,
201
+ name : impl AsRef < str > ,
199
202
lst : StdTcpListener ,
200
203
factory : F ,
201
204
) -> io:: Result < Self >
202
205
where
203
- F : ServiceFactory < TcpStream > ,
206
+ F : ServiceFactory < TcpStream , Config = ( ) , InitError = InitErr > + Send + Clone + ' static ,
207
+ InitErr : fmt:: Debug + Send + ' static ,
204
208
{
205
209
lst. set_nonblocking ( true ) ?;
206
210
@@ -259,7 +263,7 @@ impl ServerBuilder {
259
263
Signals :: start ( self . server . clone ( ) ) ;
260
264
}
261
265
262
- // start http server actor
266
+ // start http server
263
267
let server = self . server . clone ( ) ;
264
268
rt:: spawn ( self ) ;
265
269
server
@@ -402,11 +406,19 @@ impl ServerBuilder {
402
406
#[ cfg( unix) ]
403
407
impl ServerBuilder {
404
408
/// Add new unix domain service to the server.
405
- pub fn bind_uds < F , U , N > ( self , name : N , addr : U , factory : F ) -> io:: Result < Self >
409
+ pub fn bind_uds < F , U , InitErr > (
410
+ self ,
411
+ name : impl AsRef < str > ,
412
+ addr : U ,
413
+ factory : F ,
414
+ ) -> io:: Result < Self >
406
415
where
407
- F : ServiceFactory < actix_rt:: net:: UnixStream > ,
408
- N : AsRef < str > ,
416
+ F : ServiceFactory < actix_rt:: net:: UnixStream , Config = ( ) , InitError = InitErr >
417
+ + Send
418
+ + Clone
419
+ + ' static ,
409
420
U : AsRef < std:: path:: Path > ,
421
+ InitErr : fmt:: Debug + Send + ' static ,
410
422
{
411
423
// The path must not exist when we try to bind.
412
424
// Try to remove it to avoid bind error.
@@ -424,14 +436,18 @@ impl ServerBuilder {
424
436
/// Add new unix domain service to the server.
425
437
///
426
438
/// Useful when running as a systemd service and a socket FD can be passed to the process.
427
- pub fn listen_uds < F , N : AsRef < str > > (
439
+ pub fn listen_uds < F , InitErr > (
428
440
mut self ,
429
- name : N ,
441
+ name : impl AsRef < str > ,
430
442
lst : crate :: socket:: StdUnixListener ,
431
443
factory : F ,
432
444
) -> io:: Result < Self >
433
445
where
434
- F : ServiceFactory < actix_rt:: net:: UnixStream > ,
446
+ F : ServiceFactory < actix_rt:: net:: UnixStream , Config = ( ) , InitError = InitErr >
447
+ + Send
448
+ + Clone
449
+ + ' static ,
450
+ InitErr : fmt:: Debug + Send + ' static ,
435
451
{
436
452
use std:: net:: { IpAddr , Ipv4Addr } ;
437
453
0 commit comments