All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.finagle.http2.transport.SchemifyingHandler.scala Maven / Gradle / Ivy

There is a newer version: 6.39.0
Show newest version
package com.twitter.finagle.http2.transport

import io.netty.channel.{ChannelDuplexHandler, ChannelHandlerContext, ChannelPromise}
import io.netty.handler.codec.http.HttpClientUpgradeHandler.UpgradeEvent
import io.netty.handler.codec.http.HttpRequest
import io.netty.handler.codec.http2.HttpConversionUtil.ExtensionHeaderNames.SCHEME

/**
 * Http/2 requires that clients specify a scheme, and netty wants to get that
 * from a port, prefix, or special header.  Most use cases don't need a prefix
 * or a port, so we add the special header on behalf of users.
 */
private[http2] class SchemifyingHandler(defaultScheme: String) extends ChannelDuplexHandler {
  override def userEventTriggered(ctx: ChannelHandlerContext, event: Any): Unit = {
    event match {
      case [email protected]_REJECTED =>
        // we no longer need to schemify if the upgrade was rejected
        ctx.pipeline.remove(this)
      case _ => // nop
    }
    super.userEventTriggered(ctx, event)
  }

  /**
   * We need to make sure that we add the scheme properly, since it'll be rejected
   * by the http2 codec if we don't.
   */
  override def write(ctx: ChannelHandlerContext, msg: Any, promise: ChannelPromise): Unit = {
    msg match {
      case req: HttpRequest =>
        if (!req.headers.contains(SCHEME.text(), defaultScheme, true /*ignoreCase*/))
          req.headers.add(SCHEME.text(), defaultScheme)
      case _ => // nop
    }
    ctx.write(msg, promise)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy