Handshake middleware
Upgrade öncesinde politika uygulayın, scoped servis çözün ve doğrulanmış HTTP rejection döndürün.
Handshake middleware, HTTP 101 öncesinde çalışır. Endpoint, Origin ve subprotocol doğrulamasından sonra; identity middleware'den önce uygulanır. Başarısız bir kontrol bağlantının kurulmasını önler.
Middleware yazın#
Aşağıdaki dosyadaki RequireDirectTls, TLS'in doğrudan Lily listener'ında sonlandığı kurulum içindir. Aynı dosyada sonraki sayfada açıklanan ConnectionAudit da bulunur. İlk uygulamanın plaintext listener'ına bu policy eklerseniz bütün istekler reddedilir; önce WSS kurun.
use std::sync::Arc;
use lilyrs::websocket::{CleanupCancellation, ExecutionCancellation, Extensions,
WebSocketContext, WsAppBuilder, async_trait};
use lilyrs::websocket::middleware::{MiddlewareDescriptor, MiddlewareErrorCode, MiddlewareKind,
WebSocketHandshakeMiddleware, WsConnectionCloseCategory, WsConnectionMiddleware,
WsHandshakeExchange, WsHandshakeRejection, WsMiddlewareError, WsMiddlewareInitError};
pub struct RequireDirectTls;
#[async_trait]
impl WebSocketHandshakeMiddleware for RequireDirectTls {
async fn new(_: Arc<Extensions>) -> Result<Self, WsMiddlewareInitError> { Ok(Self) }
fn descriptor(&self) -> MiddlewareDescriptor {
MiddlewareDescriptor::new("direct_tls", MiddlewareKind::WebSocketHandshake)
}
async fn handle(&self, exchange: &mut WsHandshakeExchange, _: ExecutionCancellation)
-> Result<(), WsHandshakeRejection>
{
if exchange.request().is_secure() { Ok(()) }
else { Err(WsHandshakeRejection::forbidden(
MiddlewareErrorCode::new("TLS_REQUIRED").expect("sabit kod"))) }
}
}
pub struct ConnectionAudit;
#[async_trait]
impl WsConnectionMiddleware for ConnectionAudit {
async fn new(_: Arc<Extensions>) -> Result<Self, WsMiddlewareInitError> { Ok(Self) }
fn descriptor(&self) -> MiddlewareDescriptor {
MiddlewareDescriptor::new("connection_audit", MiddlewareKind::WebSocketConnection)
}
async fn admit(&self, _: Arc<WebSocketContext>, _: ExecutionCancellation)
-> Result<(), WsMiddlewareError> { Ok(()) }
async fn opened(&self, context: Arc<WebSocketContext>, _: ExecutionCancellation)
-> Result<(), WsMiddlewareError>
{
let _namespace = context.namespace();
Ok(())
}
async fn closed(&self, _: Arc<WebSocketContext>, category: WsConnectionCloseCategory,
stopping: CleanupCancellation) -> Result<(), WsMiddlewareError>
{
let _ = (category, stopping.is_cancelled());
Ok(())
}
}
pub fn with_connection_policy(builder: WsAppBuilder) -> WsAppBuilder {
builder.handshake_middleware::<RequireDirectTls>()
.connection_middleware::<ConnectionAudit>()
}descriptor doğru MiddlewareKind::WebSocketHandshake döndürür. handle success için Ok(()), reddetmek için WsHandshakeRejection kullanır. Constructor app başına bir kez çalışır.
Kayıt ve scoped veri#
Global kayıt .handshake_middleware::<RequireDirectTls>(), belirli controller kaydı #[handshake_middleware(RequireDirectTls)] biçimindedir. Aynı effective plan içinde aynı tipi iki kez eklemeyin. Global middleware'ler controller middleware'lerinden önce çalışır.
exchange.service::<T>().await, geçici handshake scope'undan servis çözer. insert_local ile sonraki handshake veya identity adımına typed veri verilebilir; en fazla 32 local tip saklanır. Bu veri connection local'e kendiliğinden taşınmaz. Identity sonucu içinde yalnızca gereken owned değerleri açıkça kopyalayın.
HTTP rejection seçin#
try_new(status, code) normal rejection oluşturur. 401 için unauthorized(code, challenge) kullanılır; geçerli WWW-Authenticate zorunluluğunu doğrular. Genel constructor 401, 405, 407 ve 426 gibi ek protokol yükümlülükleri olan statüleri sıradan hata olarak kabul etmez.
try_with_body bounded body, try_with_header izinli header ekler. Response header listesi WWW-Authenticate, Retry-After, Set-Cookie, Cache-Control ile sınırlıdır. Başarılı 101 response'una keyfi header/cookie yazan genel bir hook yoktur.
TLS ve süre sınırı#
is_secure(), Lily listener'ının TLS durumunu anlatır. Proxy TLS'i bitirip Lily'ye plaintext bağlanıyorsa false kalır; X-Forwarded-Proto bunu değiştirmez. Bu middleware o mimariye uyarlanmış bir edge güven politikası olmadan kullanılamaz.
ExecutionCancellation callback'e gözlem yetkisi verir. Uzun verifier veya backend işinde bu sinyali izleyin ve kendi bounded operation sözleşmesini kullanın. Authentication sonucunu connection kimliğine çevirmek için identity middleware kullanılır.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.