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