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

xitrum.handler.inbound.UriParser.scala Maven / Gradle / Ivy

The newest version!
package xitrum.handler.inbound

import java.util.{Map => JMap, List => JList}
import scala.collection.mutable.{ArrayBuffer, Map => MMap}
import scala.util.control.NonFatal

import io.netty.channel.{ChannelHandler, ChannelHandlerContext, SimpleChannelInboundHandler}
import ChannelHandler.Sharable
import io.netty.handler.codec.http.QueryStringDecoder

import xitrum.{Config, Log}
import xitrum.handler.HandlerEnv
import xitrum.scope.request.{Params, PathInfo}

@Sharable
class UriParser extends SimpleChannelInboundHandler[HandlerEnv] {
  override def channelRead0(ctx: ChannelHandlerContext, env: HandlerEnv): Unit = {
    val request = env.request

    try {
      val decoder     = new QueryStringDecoder(request.uri, Config.xitrum.request.charset)
      env.pathInfo    = new PathInfo(decoder, Config.xitrum.request.charset)
      env.queryParams = jParamsToParams(decoder.parameters)
      ctx.fireChannelRead(env)
    } catch {
      case NonFatal(e) =>
        Log.debug(s"Could not parse query params URI: ${request.uri}", e)
        BadClientSilencer.respond400(ctx.channel, "Could not parse params in URI")
    }
  }

  //----------------------------------------------------------------------------

  private def jParamsToParams(params: JMap[String, JList[String]]): Params = {
    val keySet = params.keySet

    val it  = keySet.iterator
    val ret = MMap.empty[String, Seq[String]]
    while (it.hasNext) {
      val key    = it.next()
      val values = params.get(key)

      val it2  = values.iterator
      val ret2 = ArrayBuffer.empty[String]
      while (it2.hasNext) {
        val value = it2.next()
        ret2.append(value)
      }
      ret(key) = ret2.toList
    }

    ret
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy