1
0
mirror of https://github.com/fafhrd91/actix-web synced 2025-07-25 10:09:58 +02:00

Compare commits

...

9 Commits

Author SHA1 Message Date
Nikolay Kim
e8a1664c15 prepare release 2018-12-12 14:24:46 -08:00
Nikolay Kim
d1bfae7414 fix backpressure for ssl concurrent handshakes 2018-12-12 14:24:24 -08:00
Nikolay Kim
5ca00dc798 rename ServiceConfig::rt to ServiceConfig::apply 2018-12-12 14:16:16 -08:00
Nikolay Kim
fd3e77ea83 fix signals handling on windows 2018-12-11 14:03:06 -08:00
Nikolay Kim
d38eb00793 no readme 2018-12-11 08:36:03 -08:00
Nikolay Kim
3c9d95bd9f no readme 2018-12-11 08:33:28 -08:00
Nikolay Kim
331db2eb47 use released version 2018-12-11 08:28:44 -08:00
Nikolay Kim
de66b5c776 fix examples 2018-12-11 08:20:19 -08:00
Nikolay Kim
4adbbad450 update travis config 2018-12-11 08:13:58 -08:00
13 changed files with 105 additions and 80 deletions

View File

@@ -33,10 +33,12 @@ script:
if [[ "$TRAVIS_RUST_VERSION" != "nightly" ]]; then
cargo clean
cargo test --features="ssl,tls,rust-tls" -- --nocapture
cd actix-codec && cargo test
cd actix-service && cargo test
cd actix-server && cargo test --features="ssl,tls,rust-tls" -- --nocapture
cd actix-rt && cargo test
cd actix-codec && cargo test && cd ..
cd actix-service && cargo test && cd ..
cd actix-server && cargo test --features="ssl,tls,rust-tls" -- --nocapture && cd ..
cd actix-rt && cargo test && cd ..
cd actix-connector && cargo test && cd ..
cd actix-utils && cargo test && cd ..
fi
- |
if [[ "$TRAVIS_RUST_VERSION" == "nightly" ]]; then
@@ -44,16 +46,10 @@ script:
cargo tarpaulin --features="ssl,tls,rust-tls" --out Xml
bash <(curl -s https://codecov.io/bash)
echo "Uploaded code coverage"
cd actix-service && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash)
fi
# Upload docs
after_success:
- |
if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_PULL_REQUEST" = "false" && "$TRAVIS_BRANCH" == "master" && "$TRAVIS_RUST_VERSION" == "beta" ]]; then
cargo doc --features "ssl,tls,rust-tls" --no-deps &&
echo "<meta http-equiv=refresh content=0;url=os_balloon/index.html>" > target/doc/index.html &&
git clone https://github.com/davisp/ghp-import.git &&
./ghp-import/ghp_import.py -n -p -f -m "Documentation upload" -r https://"$GH_TOKEN"@github.com/"$TRAVIS_REPO_SLUG.git" target/doc &&
echo "Uploaded documentation"
cd actix-service && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
cd actix-rt && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
cd actix-connector && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
cd actix-codec && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
cd actix-server && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
cd actix-utils && cargo tarpaulin --out Xml && bash <(curl -s https://codecov.io/bash) && cd ..
fi

View File

@@ -22,3 +22,13 @@ members = [
"actix-rt",
"actix-utils",
]
[dev-dependencies]
actix-service = "0.1.1"
actix-codec = "0.1.0"
actix-rt = { path="actix-rt" }
actix-server = { path="actix-server", features=["ssl"] }
env_logger = "0.5"
futures = "0.1.24"
openssl = { version="0.10" }
tokio-openssl = { version="0.3" }

View File

@@ -3,7 +3,6 @@ name = "actix-connector"
version = "0.1.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix Connector - tcp connector service"
readme = "README.md"
keywords = ["network", "framework", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git"
@@ -29,19 +28,13 @@ ssl = ["openssl", "tokio-openssl"]
[dependencies]
actix-service = "0.1.1"
actix-codec = { path = "../actix-codec" }
actix-rt = { path = "../actix-rt" }
actix-codec = "0.1.0"
actix-rt = "0.1.0"
futures = "0.1"
tokio-tcp = "0.1"
trust-dns-proto = "^0.5.0"
trust-dns-resolver = "^0.10.0"
# openssl
openssl = { version="0.10", optional = true }
tokio-openssl = { version="0.3", optional = true }
[profile.release]
lto = true
opt-level = 3
codegen-units = 1

View File

@@ -1,5 +1,22 @@
# Changes
## [0.1.2] - 2018-12-12
## Changed
* rename ServiceConfig::rt() to ServiceConfig::apply()
### Fixed
* Fix back-pressure for concurrent ssl handshakes
## [0.1.1] - 2018-12-11
* Fix signal handling on windows
## [0.1.0] - 2018-12-09
* Move server to separate crate

View File

@@ -1,9 +1,8 @@
[package]
name = "actix-server"
version = "0.1.0"
version = "0.1.2"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix server - General purpose tcp server"
readme = "README.md"
keywords = ["network", "framework", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git"
@@ -35,7 +34,7 @@ rust-tls = ["rustls", "tokio-rustls", "webpki", "webpki-roots"]
[dependencies]
actix-service = "0.1.1"
actix-rt = { path = "../actix-rt" }
actix-rt = "0.1.0"
log = "0.4"
num_cpus = "1.0"
@@ -67,8 +66,6 @@ webpki-roots = { version = "0.15", optional = true }
[dev-dependencies]
env_logger = "0.5"
[profile.release]
lto = true
opt-level = 3
codegen-units = 1
actix-service = "0.1.1"
actix-codec = "0.1.0"
actix-rt = "0.1.0"

View File

@@ -64,7 +64,7 @@ impl ServerBuilder {
/// Set number of workers to start.
///
/// By default server uses number of available logical cpu as threads
/// By default server uses number of available logical cpu as workers
/// count.
pub fn workers(mut self, num: usize) -> Self {
self.threads = num;
@@ -108,8 +108,8 @@ impl ServerBuilder {
self
}
/// Run external configuration as part of the server building
/// process
/// Execute external configuration as part of the server building
/// process.
///
/// This function is useful for moving parts of configuration to a
/// different module or even library.
@@ -117,17 +117,20 @@ impl ServerBuilder {
where
F: Fn(&mut ServiceConfig) -> io::Result<()>,
{
let mut cfg = ServiceConfig::new();
let mut cfg = ServiceConfig::new(self.threads);
f(&mut cfg)?;
let mut srv = ConfiguredService::new(cfg.rt);
for (name, lst) in cfg.services {
let token = self.token.next();
srv.stream(token, name);
self.sockets.push((token, lst));
if let Some(apply) = cfg.apply {
let mut srv = ConfiguredService::new(apply);
for (name, lst) in cfg.services {
let token = self.token.next();
srv.stream(token, name);
self.sockets.push((token, lst));
}
self.services.push(Box::new(srv));
}
self.services.push(Box::new(srv));
self.threads = cfg.threads;
Ok(self)
}

View File

@@ -15,18 +15,28 @@ use super::services::{
use super::Token;
pub struct ServiceConfig {
pub(super) services: Vec<(String, net::TcpListener)>,
pub(super) rt: Box<ServiceRuntimeConfiguration>,
pub(crate) services: Vec<(String, net::TcpListener)>,
pub(crate) apply: Option<Box<ServiceRuntimeConfiguration>>,
pub(crate) threads: usize,
}
impl ServiceConfig {
pub(super) fn new() -> ServiceConfig {
pub(super) fn new(threads: usize) -> ServiceConfig {
ServiceConfig {
threads,
services: Vec::new(),
rt: Box::new(not_configured),
apply: None,
}
}
/// Set number of workers to start.
///
/// By default server uses number of available logical cpu as workers
/// count.
pub fn workers(&mut self, num: usize) {
self.threads = num;
}
/// Add new service to server
pub fn bind<U, N: AsRef<str>>(&mut self, name: N, addr: U) -> io::Result<&mut Self>
where
@@ -43,16 +53,20 @@ impl ServiceConfig {
/// Add new service to server
pub fn listen<N: AsRef<str>>(&mut self, name: N, lst: net::TcpListener) -> &mut Self {
if self.apply.is_none() {
self.apply = Some(Box::new(not_configured));
}
self.services.push((name.as_ref().to_string(), lst));
self
}
/// Register service configuration function
pub fn rt<F>(&mut self, f: F) -> io::Result<()>
/// Register service configuration function. This function get called
/// during worker runtime configuration. It get executed in worker thread.
pub fn apply<F>(&mut self, f: F) -> io::Result<()>
where
F: Fn(&mut ServiceRuntime) + Send + Clone + 'static,
{
self.rt = Box::new(f);
self.apply = Some(Box::new(f));
Ok(())
}
}

View File

@@ -9,6 +9,7 @@ use futures::task::AtomicTask;
/// Counter could be cloned, total ncount is shared across all clones.
pub struct Counter(Rc<CounterInner>);
#[derive(Debug)]
struct CounterInner {
count: Cell<usize>,
capacity: usize,
@@ -40,6 +41,7 @@ impl Counter {
}
}
#[derive(Debug)]
pub struct CounterGuard(Rc<CounterInner>);
impl CounterGuard {
@@ -57,11 +59,7 @@ impl Drop for CounterGuard {
impl CounterInner {
fn inc(&self) {
let num = self.count.get() + 1;
self.count.set(num);
if num == self.capacity {
self.task.register();
}
self.count.set(self.count.get() + 1);
}
fn dec(&self) {
@@ -73,6 +71,10 @@ impl CounterInner {
}
fn available(&self) -> bool {
self.count.get() < self.capacity
let avail = self.count.get() < self.capacity;
if !avail {
self.task.register();
}
avail
}
}

View File

@@ -34,10 +34,12 @@ impl Signals {
let fut = {
#[cfg(not(unix))]
{
tokio_signal::ctrl_c().and_then(move |stream| Signals {
srv,
stream: Box::new(stream.map(|_| Signal::Int)),
})
tokio_signal::ctrl_c()
.map_err(|_| ())
.and_then(move |stream| Signals {
srv,
stream: Box::new(stream.map(|_| Signal::Int)),
})
}
#[cfg(unix)]

View File

@@ -398,7 +398,7 @@ impl Future for Worker {
let guard = self.conns.get();
let _ = self.services[msg.token.0]
.as_mut()
.expect("actix net bug")
.expect("actix-server bug")
.1
.call((Some(guard), ServerMessage::Connect(msg.io)));
continue;

View File

@@ -3,7 +3,6 @@ name = "actix-utils"
version = "0.1.0"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix utils - various actix net related services"
readme = "README.md"
keywords = ["network", "framework", "async", "futures"]
homepage = "https://actix.rs"
repository = "https://github.com/actix/actix-net.git"
@@ -20,15 +19,10 @@ path = "src/lib.rs"
[dependencies]
actix-service = "0.1.1"
actix-codec = { path = "../actix-codec" }
actix-rt = { path = "../actix-rt" }
actix-codec = "0.1.0"
actix-rt = "0.1.0"
# io
bytes = "0.4"
futures = "0.1"
tokio-timer = "0.2.8"
[profile.release]
lto = true
opt-level = 3
codegen-units = 1

View File

@@ -7,15 +7,14 @@ use std::sync::{
};
use std::{env, fmt};
use actix_codec::{AsyncRead, AsyncWrite};
use actix_rt::System;
use actix_server::Server;
use actix_service::{IntoNewService, NewService};
use futures::{future, Future};
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
use tokio_io::{AsyncRead, AsyncWrite};
use tokio_openssl::SslAcceptorExt;
use actix_net::server::Server;
use actix_rt::System;
use actix_service::{IntoNewService, NewService};
/// Simple logger service, it just prints fact of the new connections
fn logger<T: AsyncRead + AsyncWrite + fmt::Debug>(
stream: T,

View File

@@ -3,14 +3,12 @@ use std::sync::{
Arc,
};
use actix_codec::{AsyncRead, AsyncWrite};
use actix_rt::System;
use actix_server::{ssl, Server};
use actix_service::NewService;
use futures::{future, Future};
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
use tokio_io::{AsyncRead, AsyncWrite};
use actix_net::server::Server;
use actix_net::ssl;
use actix_rt::System;
use actix_service::NewService;
#[derive(Debug)]
struct ServiceState {