@@ -2,19 +2,42 @@ package sttp.tapir.server.netty
22
33import scala .collection .JavaConverters ._
44import scala .collection .immutable .Seq
5+ import io .netty .channel .ChannelHandlerContext
56import io .netty .handler .codec .http .{HttpRequest , QueryStringDecoder }
7+ import io .netty .handler .ssl .SslHandler
68import sttp .model .{Header , Method , QueryParams , Uri }
79import sttp .tapir .{AttributeKey , AttributeMap }
810import sttp .tapir .model .{ConnectionInfo , ServerRequest }
911import sttp .tapir .server .netty .internal .RichNettyHttpHeaders
1012import io .netty .handler .codec .http .FullHttpRequest
13+ import java .net .InetSocketAddress
1114
12- case class NettyServerRequest (req : HttpRequest , attributes : AttributeMap = AttributeMap .Empty ) extends ServerRequest {
15+ case class NettyServerRequest (req : HttpRequest , ctx : ChannelHandlerContext , attributes : AttributeMap = AttributeMap .Empty )
16+ extends ServerRequest {
1317 // non-lazy, so that we can validate that the URI parses upfront
1418 override val uri : Uri = Uri .unsafeParse(req.uri())
1519
1620 override lazy val protocol : String = req.protocolVersion().text()
17- override lazy val connectionInfo : ConnectionInfo = ConnectionInfo .NoInfo
21+
22+ override lazy val connectionInfo : ConnectionInfo = {
23+ val local = ctx.channel().localAddress() match {
24+ case inet : InetSocketAddress => Some (inet)
25+ case _ => None
26+ }
27+
28+ val remote = ctx.channel().remoteAddress() match {
29+ case inet : InetSocketAddress => Some (inet)
30+ case _ => None
31+ }
32+
33+ val secure = uri.scheme match {
34+ case Some (" https" ) | Some (" wss" ) => Some (true )
35+ case Some (" http" ) | Some (" ws" ) => Some (false )
36+ case _ => None
37+ }
38+
39+ ConnectionInfo (local, remote, secure)
40+ }
1841 override lazy val underlying : Any = req
1942 override lazy val queryParameters : QueryParams = {
2043 val decoder = new QueryStringDecoder (req.uri())
@@ -37,5 +60,5 @@ case class NettyServerRequest(req: HttpRequest, attributes: AttributeMap = Attri
3760 override def attribute [T ](k : AttributeKey [T ]): Option [T ] = attributes.get(k)
3861 override def attribute [T ](k : AttributeKey [T ], v : T ): NettyServerRequest = copy(attributes = attributes.put(k, v))
3962 override def withUnderlying (underlying : Any ): ServerRequest =
40- NettyServerRequest (req = underlying.asInstanceOf [HttpRequest ], attributes)
63+ NettyServerRequest (req = underlying.asInstanceOf [HttpRequest ], ctx = ctx, attributes = attributes)
4164}
0 commit comments