aiguofer commented on issue #38911:
URL: https://github.com/apache/arrow/issues/38911#issuecomment-1868017220

   We currently accomplish this with a gRPC `ServerInterceptor` to add it to 
the `RequestContext` (in Kotlin):
   
   ```
   class RequestContextKeys {
       companion object {
           const val AUTHORITY = "authority"
           const val SCHEME = "scheme"
           const val PORT = "port"
           const val INCOMING_URL = "incomingUrl"
           const val REQUEST_ID = "request_id"
       }
   }
   
   /*
    * Simple interceptor to add more metadata from the call to the 
RequestContext.
    */
   class RequestContextInterceptor : ServerInterceptor {
       override fun <ReqT : Any, RespT : Any> interceptCall(
           call: ServerCall<ReqT, RespT>,
           headers: Metadata,
           next: ServerCallHandler<ReqT, RespT>
       ): ServerCall.Listener<ReqT> {
           RequestContextAdapter.REQUEST_CONTEXT_KEY.get()?.also { 
requestContext ->
               val authority =
                   call.authority ?: throw InternalServiceException("Could not 
find authority")
               val scheme = if (authority.startsWith("localhost")) "http" else 
"https"
               val port =
                   when {
                       authority.contains(":") -> authority.substringAfter(":")
                       scheme == "https" -> "443"
                       else -> throw InternalServiceException("Could not infer 
port number")
                   }
               val host = authority.substringBefore(":")
   
               requestContext.put(RequestContextKeys.AUTHORITY, authority)
               requestContext.put(RequestContextKeys.SCHEME, scheme)
               requestContext.put(RequestContextKeys.PORT, port)
               requestContext.put(RequestContextKeys.INCOMING_URL, 
"$scheme://$host:$port")
           }
           return next.startCall(call, headers)
       }
   }
   ```
   
   We can then access it anywhere using:
   
   ```
   val requestContext = RequestContextAdapter.REQUEST_CONTEXT_KEY.get()
   requestContext.get(RequestContextKeys.INCOMING_URL)
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to