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

com.outbrain.ob1k.server.netty.NettyRequest Maven / Gradle / Ivy

The newest version!
package com.outbrain.ob1k.server.netty;

import com.google.common.base.Function;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.outbrain.ob1k.HttpRequestMethodType;
import com.outbrain.ob1k.Request;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.channel.Channel;
import io.netty.handler.codec.http.Cookie;
import io.netty.handler.codec.http.CookieDecoder;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.QueryStringDecoder;
import io.netty.util.CharsetUtil;

import java.io.InputStream;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;

/**
 * User: aronen
 * Date: 6/30/13
 * Time: 12:02 PM
 */
public class NettyRequest implements Request {
  public static final String COOKIE_HEADER = "Cookie";
  private final HttpRequest inner;
  private final Channel channel;
  private final QueryStringDecoder getQueryDecoder;
  private final HttpContent content;
  private final String contextPath;
  private final Map pathParams;
  private QueryStringDecoder postQueryDecoder;
  private Map cookies;


  public NettyRequest(final HttpRequest inner, final HttpContent content, final Channel channel, final String contextPath) {
    this.inner = inner;
    this.content = content;
    this.channel = channel;
    this.getQueryDecoder = new QueryStringDecoder(inner.getUri());
    this.contextPath = contextPath;
    this.pathParams = new HashMap<>();
  }

  @Override
  public HttpRequestMethodType getMethod() {
    return HttpRequestMethodType.valueOf(inner.getMethod().name().toUpperCase());
  }

  @Override
  public String getUri() {
    return inner.getUri();
  }

  @Override
  public String getHeader(final String name) {
    return inner.headers().get(name);
  }

  @Override
  public List getHeaders(final String name) {
    return inner.headers().getAll(name);
  }

  public Map getHeaders() {
    final HttpHeaders headers = inner.headers();
    final List> entries = headers.entries();
    final Map result = new HashMap<>();
    for (final Map.Entry entry : entries) {
      result.put(entry.getKey(), entry.getValue());
    }

    return result;
  }

  @Override
  public Map> getAllHeaders() {
    final HttpHeaders headers = inner.headers();
    final List> entries = headers.entries();
    final Map> result = new HashMap<>();
    for (final Map.Entry entry : entries) {
      List list = result.get(entry.getKey());
      if (list == null) {
        list = new ArrayList<>();
        result.put(entry.getKey(), list);
      }

      list.add(entry.getValue());
    }

    return result;
  }

  @Override
  public long getContentLength() {
    return content.content().readableBytes();
  }

  public String getContentType() {
    return inner.headers().get(CONTENT_TYPE);
  }

  @Override
  public String getRequestBody() {
    final ByteBuf buffer = content.content();
    return buffer.toString(CharsetUtil.UTF_8);
  }

  @Override
  public InputStream getRequestInputStream() {
    return new ByteBufInputStream(content.content());
  }

  @Override
  public InetSocketAddress getLocalAddress() {
    return (InetSocketAddress) channel.localAddress();
  }

  @Override
  public InetSocketAddress getRemoteAddress() {
    return (InetSocketAddress) channel.remoteAddress();
  }

  @Override
  public Map getPathParams() {
    return pathParams;
  }

  @Override
  public String getPathParam(final String key) {
    return pathParams.get(key);
  }

  @Override
  public String getQueryParam(final String key) {
    final Map> parameters = getQueryDecoder.parameters();
    final List valueOptions = parameters.get(key);
    return  (valueOptions == null || valueOptions.isEmpty()) ? null : valueOptions.get(0);
  }

  @Override
  public String getPostQueryParam(final String key) {
    if (postQueryDecoder == null) {
      postQueryDecoder = new QueryStringDecoder(getRequestBody(), false);
    }

    final Map> parameters = postQueryDecoder.parameters();
    final List valueOptions = parameters.get(key);
    return  (valueOptions == null || valueOptions.isEmpty()) ? null : valueOptions.get(0);
  }

  @Override
  public String getPostQueryParam(final String key, final String defaultValue) {
    final String res = getPostQueryParam(key);
    return res != null ? res : defaultValue;
  }

  public String getQueryParam(final String key, final String defaultValue) {
    final String res = getQueryParam(key);
    return res != null ? res : defaultValue;
  }

  @Override
  public List getQueryParams(final String key) {
    final Map> parameters = getQueryDecoder.parameters();
    return parameters.get(key);
  }

  @Override
  public Map getQueryParams() {
    final Map> parameters = getQueryDecoder.parameters();
    final Map result = new HashMap<>();
    for (final String key : parameters.keySet()) {
      result.put(key, parameters.get(key).get(0));
    }

    return result;
  }

  @Override
  public String getPath() {
    return getQueryDecoder.path();
  }

  @Override
  public String getContextPath() {
    return contextPath;
  }

  @Override
  public String getCookie(final String cookieName) {
    if (cookies == null) {
      populateCookies();
    }

    final Cookie cookie = cookies.get(cookieName);
    return cookie != null ? cookie.getValue() : null;
  }

  private void populateCookies() {
    cookies = Maps.newHashMap();

    final String cookieHeaderValue = inner.headers().get(COOKIE_HEADER);
    if (cookieHeaderValue == null) return;

    final Set cookiesSet = CookieDecoder.decode(cookieHeaderValue);
    for (final Cookie cookie : cookiesSet) {
      cookies.put(cookie.getName(), cookie);
    }
  }

  @Override
  public String getProtocol() {
    return inner.getProtocolVersion().text();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy