mirror of
				https://github.com/nitnelave/lldap.git
				synced 2023-04-12 14:25:13 +00:00 
			
		
		
		
	Replace the echo server with an HTTP server
This commit is contained in:
		
							parent
							
								
									d771293a43
								
							
						
					
					
						commit
						f8f642183e
					
				
							
								
								
									
										11
									
								
								Cargo.toml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Cargo.toml
									
									
									
									
									
								
							@ -5,11 +5,12 @@ name = "lldap"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
actix = "0.11.0-beta.3"
 | 
			
		||||
actix-rt = "2.1.0"
 | 
			
		||||
actix-server = "2.0.0-beta.3"
 | 
			
		||||
actix-service = "2.0.0-beta.4"
 | 
			
		||||
actix-web = "4.0.0-beta.3"
 | 
			
		||||
actix = "0.11.1"
 | 
			
		||||
actix-http = "3.0.0-beta.6"
 | 
			
		||||
actix-rt = "2.2"
 | 
			
		||||
actix-server = "2.0.0-beta.5"
 | 
			
		||||
actix-service = "2.0.0"
 | 
			
		||||
actix-web = "4.0.0-beta.6"
 | 
			
		||||
anyhow = "*"
 | 
			
		||||
clap = "3.0.0-beta.2"
 | 
			
		||||
chrono = "*"
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,8 @@ use crate::infra::configuration::Configuration;
 | 
			
		||||
use crate::infra::ldap_handler::LdapHandler;
 | 
			
		||||
use actix_rt::net::TcpStream;
 | 
			
		||||
use actix_server::ServerBuilder;
 | 
			
		||||
use actix_service::{fn_service, pipeline_factory};
 | 
			
		||||
use anyhow::bail;
 | 
			
		||||
use anyhow::Result;
 | 
			
		||||
use actix_service::{fn_service, ServiceFactoryExt};
 | 
			
		||||
use anyhow::{bail, Result};
 | 
			
		||||
use futures_util::future::ok;
 | 
			
		||||
use ldap3_server::simple::*;
 | 
			
		||||
use ldap3_server::LdapCodec;
 | 
			
		||||
@ -68,7 +67,7 @@ where
 | 
			
		||||
            let backend_handler = backend_handler.clone();
 | 
			
		||||
            let ldap_base_dn = ldap_base_dn.clone();
 | 
			
		||||
            let ldap_user_dn = ldap_user_dn.clone();
 | 
			
		||||
            pipeline_factory(fn_service(move |mut stream: TcpStream| {
 | 
			
		||||
            fn_service(move |mut stream: TcpStream| {
 | 
			
		||||
                let backend_handler = backend_handler.clone();
 | 
			
		||||
                let ldap_base_dn = ldap_base_dn.clone();
 | 
			
		||||
                let ldap_user_dn = ldap_user_dn.clone();
 | 
			
		||||
@ -88,7 +87,7 @@ where
 | 
			
		||||
 | 
			
		||||
                    Ok(stream)
 | 
			
		||||
                }
 | 
			
		||||
            }))
 | 
			
		||||
            })
 | 
			
		||||
            .map_err(|err: anyhow::Error| error!("Service Error: {:?}", err))
 | 
			
		||||
            // catch
 | 
			
		||||
            .and_then(move |_| {
 | 
			
		||||
 | 
			
		||||
@ -1,72 +1,25 @@
 | 
			
		||||
use crate::domain::handler::*;
 | 
			
		||||
use crate::infra::configuration::Configuration;
 | 
			
		||||
use actix_rt::net::TcpStream;
 | 
			
		||||
use actix_http::HttpServiceBuilder;
 | 
			
		||||
use actix_server::ServerBuilder;
 | 
			
		||||
use actix_service::pipeline_factory;
 | 
			
		||||
use actix_service::map_config;
 | 
			
		||||
use actix_web::dev::AppConfig;
 | 
			
		||||
use actix_web::App;
 | 
			
		||||
use anyhow::{Context, Result};
 | 
			
		||||
use futures_util::future::ok;
 | 
			
		||||
use log::*;
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
 | 
			
		||||
pub fn build_tcp_server<Backend>(
 | 
			
		||||
    config: &Configuration,
 | 
			
		||||
    backend_handler: Backend,
 | 
			
		||||
    _backend_handler: Backend,
 | 
			
		||||
    server_builder: ServerBuilder,
 | 
			
		||||
) -> Result<ServerBuilder>
 | 
			
		||||
where
 | 
			
		||||
    Backend: BackendHandler + 'static,
 | 
			
		||||
{
 | 
			
		||||
    use std::sync::atomic::AtomicUsize;
 | 
			
		||||
    use std::sync::atomic::Ordering;
 | 
			
		||||
    use tokio::io::AsyncReadExt;
 | 
			
		||||
    use tokio::io::AsyncWriteExt;
 | 
			
		||||
 | 
			
		||||
    let count = Arc::new(AtomicUsize::new(0));
 | 
			
		||||
 | 
			
		||||
    server_builder
 | 
			
		||||
        .bind("http", ("0.0.0.0", config.http_port), move || {
 | 
			
		||||
            let count = Arc::clone(&count);
 | 
			
		||||
            let num2 = Arc::clone(&count);
 | 
			
		||||
 | 
			
		||||
            pipeline_factory(move |mut stream: TcpStream| {
 | 
			
		||||
                let count = Arc::clone(&count);
 | 
			
		||||
                async move {
 | 
			
		||||
                    let num = count.fetch_add(1, Ordering::SeqCst);
 | 
			
		||||
                    let num = num + 1;
 | 
			
		||||
 | 
			
		||||
                    let mut size: usize = 0;
 | 
			
		||||
                    let mut buf = Vec::with_capacity(4096);
 | 
			
		||||
 | 
			
		||||
                    loop {
 | 
			
		||||
                        match stream.read_buf(&mut buf).await {
 | 
			
		||||
                            // end of stream; bail from loop
 | 
			
		||||
                            Ok(0) => break,
 | 
			
		||||
 | 
			
		||||
                            // more bytes to process
 | 
			
		||||
                            Ok(bytes_read) => {
 | 
			
		||||
                                info!("[{}] read {} bytes", num, bytes_read);
 | 
			
		||||
                                stream.write_all(&buf[size..]).await.unwrap();
 | 
			
		||||
                                size += bytes_read;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            // stream error; bail from loop with error
 | 
			
		||||
                            Err(err) => {
 | 
			
		||||
                                error!("Stream Error: {:?}", err);
 | 
			
		||||
                                return Err(());
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    // send data down service pipeline
 | 
			
		||||
                    Ok((buf, size))
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .map_err(|err| error!("Service Error: {:?}", err))
 | 
			
		||||
            .and_then(move |(_, size)| {
 | 
			
		||||
                let num = num2.load(Ordering::SeqCst);
 | 
			
		||||
                info!("[{}] total bytes read: {}", num, size);
 | 
			
		||||
                ok(size)
 | 
			
		||||
            })
 | 
			
		||||
            HttpServiceBuilder::new()
 | 
			
		||||
                .finish(map_config(App::new(), |_| AppConfig::default()))
 | 
			
		||||
                .tcp()
 | 
			
		||||
        })
 | 
			
		||||
        .with_context(|| {
 | 
			
		||||
            format!(
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user