2017-10-19 3 views
3

SMTPサーバーは、クライアントがコマンドの送信を開始するための信号である接続確立時にウェルカムメッセージを表示する必要があります(220サービス準備完了)。これはtokio-protoの要求 - 応答のパラダイムと矛盾しているようです。クライアントがtokio-protoサーバーに接続したときにウェルカムメッセージ/バナーを表示するにはどうすればよいですか?

私は、サーバーが要求とクライアントの応答(非推奨のTURN)を送信するなど、完全に逆転している可能性がありますが、現時点では接続時のウェルカムメッセージ、つまりバナーにしか関心がありません。その後、クライアント要求=>サーバー応答が維持されます。

私はこれをフックする場所を把握しようとしていますが、bind_serverbind_transportはわたしには極秘です。私は輸送を実装する必要がありますか?

これはコーデックのdecodeメソッドにあります。問題は、decodeメソッドが呼び出されていないということです。どの種類のデコードに利用できるデータがない限り、呼び出されません。私はフックするいくつかの接続の初期化メソッドがあることを期待するだろうが、私は何も見つかりませんでした。

fn decode(&mut self, buf: &mut BytesMut) -> Result { 

    if !self.initialized { 
     println!(
      "new connection from {:?} to {:?}", 
      self.peer_addr, 
      self.local_addr 
     ); 

     self.requests.push(SmtpCommand::Connect { 
      local_addr: self.local_addr, 
      peer_addr: self.peer_addr, 
     }); 

     self.initialized = true; 
    } 
    //... snip 
    match self.requests.is_empty() { 
     true => Ok(None), 
     false => Ok(Some(self.requests.remove(0))), 
    } 
} 

私の​​と私もopened an issue with tokio-protoです。

答えて

0

私自身のステートフルなトランスポートデコレータ(SmtpConnectTransport)を実装することは、このトリックでした。初期化時に、指定されたフレームが挿入されます。 initframe型をパラメータとすることで汎用的な解決策になると思います。最後のコーデックは、解析とシリアライズの他に、普通のことから何もする必要はありません。

接続直後にフレームが到着すると、サービスは希望するウェルカムメッセージまたはバナーを生成できます。サービスのために、ローカルとリモートのソケットアドレスをSmtpCommand::Connectに含めました。スパム検出に使用されるためです。

私の勘違いは正しかったですが、それを実践しているのは実は錆びた金属の研削のような感じでした:D私は今どのようにこのことが嬉しいですsamotop is coming together。いくつかのコード:

​​
関連する問題