Example usage for io.netty.handler.codec.http DefaultHttpHeaders DefaultHttpHeaders

List of usage examples for io.netty.handler.codec.http DefaultHttpHeaders DefaultHttpHeaders

Introduction

In this page you can find the example usage for io.netty.handler.codec.http DefaultHttpHeaders DefaultHttpHeaders.

Prototype

protected DefaultHttpHeaders(DefaultHeaders<CharSequence, CharSequence, ?> headers) 

Source Link

Usage

From source file:com.github.ambry.rest.NettyRequestTest.java

License:Open Source License

/**
 * Tests conversion of {@link HttpRequest} to {@link NettyRequest} given good input.
 * @throws RestServiceException/*from   w w w  . ja  v a 2 s .  com*/
 */
@Test
public void conversionWithGoodInputTest() throws RestServiceException {
    // headers
    HttpHeaders headers = new DefaultHttpHeaders(false);
    headers.add(HttpHeaders.Names.CONTENT_LENGTH, new Random().nextInt(Integer.MAX_VALUE));
    headers.add("headerKey", "headerValue1");
    headers.add("headerKey", "headerValue2");
    headers.add("overLoadedKey", "headerOverloadedValue");
    headers.add("paramNoValueInUriButValueInHeader", "paramValueInHeader");
    headers.add("headerNoValue", (Object) null);
    headers.add("headerNoValueButValueInUri", (Object) null);

    // params
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    List<String> values = new ArrayList<String>(2);
    values.add("paramValue1");
    values.add("paramValue2");
    params.put("paramKey", values);
    values = new ArrayList<String>(1);
    values.add("paramOverloadedValue");
    params.put("overLoadedKey", values);
    values = new ArrayList<String>(1);
    values.add("headerValueInUri");
    params.put("headerNoValueButValueInUri", values);
    params.put("paramNoValue", null);
    params.put("paramNoValueInUriButValueInHeader", null);

    StringBuilder uriAttachmentBuilder = new StringBuilder("?");
    for (Map.Entry<String, List<String>> param : params.entrySet()) {
        if (param.getValue() != null) {
            for (String value : param.getValue()) {
                uriAttachmentBuilder.append(param.getKey()).append("=").append(value).append("&");
            }
        } else {
            uriAttachmentBuilder.append(param.getKey()).append("&");
        }
    }
    uriAttachmentBuilder.deleteCharAt(uriAttachmentBuilder.length() - 1);
    String uriAttachment = uriAttachmentBuilder.toString();

    NettyRequest nettyRequest;
    String uri;
    Set<Cookie> cookies = new HashSet<Cookie>();
    Cookie httpCookie = new DefaultCookie("CookieKey1", "CookieValue1");
    cookies.add(httpCookie);
    httpCookie = new DefaultCookie("CookieKey2", "CookieValue2");
    cookies.add(httpCookie);
    headers.add(RestUtils.Headers.COOKIE, getCookiesHeaderValue(cookies));

    uri = "/GET" + uriAttachment;
    nettyRequest = createNettyRequest(HttpMethod.GET, uri, headers);
    validateRequest(nettyRequest, RestMethod.GET, uri, headers, params, cookies);
    closeRequestAndValidate(nettyRequest);

    uri = "/POST" + uriAttachment;
    nettyRequest = createNettyRequest(HttpMethod.POST, uri, headers);
    validateRequest(nettyRequest, RestMethod.POST, uri, headers, params, cookies);
    closeRequestAndValidate(nettyRequest);

    uri = "/DELETE" + uriAttachment;
    nettyRequest = createNettyRequest(HttpMethod.DELETE, uri, headers);
    validateRequest(nettyRequest, RestMethod.DELETE, uri, headers, params, cookies);
    closeRequestAndValidate(nettyRequest);

    uri = "/HEAD" + uriAttachment;
    nettyRequest = createNettyRequest(HttpMethod.HEAD, uri, headers);
    validateRequest(nettyRequest, RestMethod.HEAD, uri, headers, params, cookies);
    closeRequestAndValidate(nettyRequest);
}

From source file:org.asynchttpclient.netty.handler.intercept.ProxyUnauthorized407Interceptor.java

License:Open Source License

public boolean exitAfterHandling407(//
        Channel channel, //
        NettyResponseFuture<?> future, //
        HttpResponse response, //
        Request request, //
        int statusCode, //
        ProxyServer proxyServer, //
        HttpRequest httpRequest) {/* w  ww.  jav  a2 s.  c o  m*/

    if (future.getInProxyAuth().getAndSet(true)) {
        LOGGER.info("Can't handle 407 as auth was already performed");
        return false;
    }

    Realm proxyRealm = future.getProxyRealm();

    if (proxyRealm == null) {
        LOGGER.info("Can't handle 407 as there's no proxyRealm");
        return false;
    }

    List<String> proxyAuthHeaders = response.headers().getAll(HttpHeaders.Names.PROXY_AUTHENTICATE);

    if (proxyAuthHeaders.isEmpty()) {
        LOGGER.info("Can't handle 407 as response doesn't contain Proxy-Authenticate headers");
        return false;
    }

    // FIXME what's this???
    future.setChannelState(ChannelState.NEW);
    HttpHeaders requestHeaders = new DefaultHttpHeaders(false).add(request.getHeaders());

    switch (proxyRealm.getScheme()) {
    case BASIC:
        if (getHeaderWithPrefix(proxyAuthHeaders, "Basic") == null) {
            LOGGER.info("Can't handle 407 with Basic realm as Proxy-Authenticate headers don't match");
            return false;
        }

        if (proxyRealm.isUsePreemptiveAuth()) {
            // FIXME do we need this, as future.getAndSetAuth
            // was tested above?
            // auth was already performed, most likely auth
            // failed
            LOGGER.info("Can't handle 407 with Basic realm as auth was preemptive and already performed");
            return false;
        }

        // FIXME do we want to update the realm, or directly
        // set the header?
        Realm newBasicRealm = realm(proxyRealm)//
                .setUsePreemptiveAuth(true)//
                .build();
        future.setProxyRealm(newBasicRealm);
        break;

    case DIGEST:
        String digestHeader = getHeaderWithPrefix(proxyAuthHeaders, "Digest");
        if (digestHeader == null) {
            LOGGER.info("Can't handle 407 with Digest realm as Proxy-Authenticate headers don't match");
            return false;
        }
        Realm newDigestRealm = realm(proxyRealm)//
                .setUri(request.getUri())//
                .setMethodName(request.getMethod())//
                .setUsePreemptiveAuth(true)//
                .parseProxyAuthenticateHeader(digestHeader)//
                .build();
        future.setProxyRealm(newDigestRealm);
        break;

    case NTLM:
        String ntlmHeader = getHeaderWithPrefix(proxyAuthHeaders, "NTLM");
        if (ntlmHeader == null) {
            LOGGER.info("Can't handle 407 with NTLM realm as Proxy-Authenticate headers don't match");
            return false;
        }
        ntlmProxyChallenge(ntlmHeader, request, requestHeaders, proxyRealm, future);
        Realm newNtlmRealm = realm(proxyRealm)//
                .setUsePreemptiveAuth(true)//
                .build();
        future.setProxyRealm(newNtlmRealm);
        break;

    case KERBEROS:
    case SPNEGO:
        if (getHeaderWithPrefix(proxyAuthHeaders, NEGOTIATE) == null) {
            LOGGER.info(
                    "Can't handle 407 with Kerberos or Spnego realm as Proxy-Authenticate headers don't match");
            return false;
        }
        try {
            kerberosProxyChallenge(channel, proxyAuthHeaders, request, proxyServer, proxyRealm, requestHeaders,
                    future);

        } catch (SpnegoEngineException e) {
            // FIXME
            String ntlmHeader2 = getHeaderWithPrefix(proxyAuthHeaders, "NTLM");
            if (ntlmHeader2 != null) {
                LOGGER.warn("Kerberos/Spnego proxy auth failed, proceeding with NTLM");
                ntlmProxyChallenge(ntlmHeader2, request, requestHeaders, proxyRealm, future);
                Realm newNtlmRealm2 = realm(proxyRealm)//
                        .setScheme(AuthScheme.NTLM)//
                        .setUsePreemptiveAuth(true)//
                        .build();
                future.setProxyRealm(newNtlmRealm2);
            } else {
                requestSender.abort(channel, future, e);
                return false;
            }
        }
        break;
    default:
        throw new IllegalStateException("Invalid Authentication scheme " + proxyRealm.getScheme());
    }

    RequestBuilder nextRequestBuilder = new RequestBuilder(future.getCurrentRequest())
            .setHeaders(requestHeaders);
    if (future.getCurrentRequest().getUri().isSecured()) {
        nextRequestBuilder.setMethod(CONNECT);
    }
    final Request nextRequest = nextRequestBuilder.build();

    LOGGER.debug("Sending proxy authentication to {}", request.getUri());
    if (future.isKeepAlive()//
            && !HttpHeaders.isTransferEncodingChunked(httpRequest)//
            && !HttpHeaders.isTransferEncodingChunked(response)) {
        future.setConnectAllowed(true);
        future.setReuseChannel(true);
        requestSender.drainChannelAndExecuteNextRequest(channel, future, nextRequest);
    } else {
        channelManager.closeChannel(channel);
        requestSender.sendNextRequest(nextRequest, future);
    }

    return true;
}

From source file:org.asynchttpclient.netty.handler.intercept.Unauthorized401Interceptor.java

License:Open Source License

public boolean exitAfterHandling401(//
        final Channel channel, //
        final NettyResponseFuture<?> future, //
        HttpResponse response, //
        final Request request, //
        int statusCode, //
        Realm realm, //
        ProxyServer proxyServer, //
        HttpRequest httpRequest) {//from   ww  w. j  a  va 2  s .c  o m

    if (realm == null) {
        LOGGER.info("Can't handle 401 as there's no realm");
        return false;
    }

    if (future.getInAuth().getAndSet(true)) {
        LOGGER.info("Can't handle 401 as auth was already performed");
        return false;
    }

    List<String> wwwAuthHeaders = response.headers().getAll(WWW_AUTHENTICATE);

    if (wwwAuthHeaders.isEmpty()) {
        LOGGER.info("Can't handle 401 as response doesn't contain WWW-Authenticate headers");
        return false;
    }

    // FIXME what's this???
    future.setChannelState(ChannelState.NEW);
    HttpHeaders requestHeaders = new DefaultHttpHeaders(false).add(request.getHeaders());

    switch (realm.getScheme()) {
    case BASIC:
        if (getHeaderWithPrefix(wwwAuthHeaders, "Basic") == null) {
            LOGGER.info("Can't handle 401 with Basic realm as WWW-Authenticate headers don't match");
            return false;
        }

        if (realm.isUsePreemptiveAuth()) {
            // FIXME do we need this, as future.getAndSetAuth
            // was tested above?
            // auth was already performed, most likely auth
            // failed
            LOGGER.info("Can't handle 401 with Basic realm as auth was preemptive and already performed");
            return false;
        }

        // FIXME do we want to update the realm, or directly
        // set the header?
        Realm newBasicRealm = realm(realm)//
                .setUsePreemptiveAuth(true)//
                .build();
        future.setRealm(newBasicRealm);
        break;

    case DIGEST:
        String digestHeader = getHeaderWithPrefix(wwwAuthHeaders, "Digest");
        if (digestHeader == null) {
            LOGGER.info("Can't handle 401 with Digest realm as WWW-Authenticate headers don't match");
            return false;
        }
        Realm newDigestRealm = realm(realm)//
                .setUri(request.getUri())//
                .setMethodName(request.getMethod())//
                .setUsePreemptiveAuth(true)//
                .parseWWWAuthenticateHeader(digestHeader)//
                .build();
        future.setRealm(newDigestRealm);
        break;

    case NTLM:
        String ntlmHeader = getHeaderWithPrefix(wwwAuthHeaders, "NTLM");
        if (ntlmHeader == null) {
            LOGGER.info("Can't handle 401 with NTLM realm as WWW-Authenticate headers don't match");
            return false;
        }

        ntlmChallenge(ntlmHeader, request, requestHeaders, realm, future);
        Realm newNtlmRealm = realm(realm)//
                .setUsePreemptiveAuth(true)//
                .build();
        future.setRealm(newNtlmRealm);
        break;

    case KERBEROS:
    case SPNEGO:
        if (getHeaderWithPrefix(wwwAuthHeaders, NEGOTIATE) == null) {
            LOGGER.info(
                    "Can't handle 401 with Kerberos or Spnego realm as WWW-Authenticate headers don't match");
            return false;
        }
        try {
            kerberosChallenge(channel, wwwAuthHeaders, request, requestHeaders, realm, future);

        } catch (SpnegoEngineException e) {
            // FIXME
            String ntlmHeader2 = getHeaderWithPrefix(wwwAuthHeaders, "NTLM");
            if (ntlmHeader2 != null) {
                LOGGER.warn("Kerberos/Spnego auth failed, proceeding with NTLM");
                ntlmChallenge(ntlmHeader2, request, requestHeaders, realm, future);
                Realm newNtlmRealm2 = realm(realm)//
                        .setScheme(AuthScheme.NTLM)//
                        .setUsePreemptiveAuth(true)//
                        .build();
                future.setRealm(newNtlmRealm2);
            } else {
                requestSender.abort(channel, future, e);
                return false;
            }
        }
        break;
    default:
        throw new IllegalStateException("Invalid Authentication scheme " + realm.getScheme());
    }

    final Request nextRequest = new RequestBuilder(future.getCurrentRequest()).setHeaders(requestHeaders)
            .build();

    LOGGER.debug("Sending authentication to {}", request.getUri());
    if (future.isKeepAlive()//
            && !HttpHeaders.isTransferEncodingChunked(httpRequest)//
            && !HttpHeaders.isTransferEncodingChunked(response)) {
        future.setReuseChannel(true);
        requestSender.drainChannelAndExecuteNextRequest(channel, future, nextRequest);
    } else {
        channelManager.closeChannel(channel);
        requestSender.sendNextRequest(nextRequest, future);
    }

    return true;
}

From source file:org.asynchttpclient.netty.request.NettyRequestSender.java

License:Open Source License

private void configureTransferAdapter(AsyncHandler<?> handler, HttpRequest httpRequest) {
    HttpHeaders h = new DefaultHttpHeaders(false).set(httpRequest.headers());
    TransferCompletionHandler.class.cast(handler).headers(h);
}

From source file:org.asynchttpclient.RequestBuilderBase.java

License:Apache License

protected RequestBuilderBase(String method, boolean disableUrlEncoding, boolean validateHeaders) {
    this.method = method;
    this.uriEncoder = UriEncoder.uriEncoder(disableUrlEncoding);
    this.headers = new DefaultHttpHeaders(validateHeaders);
}

From source file:org.asynchttpclient.RequestBuilderBase.java

License:Apache License

protected RequestBuilderBase(Request prototype, boolean disableUrlEncoding, boolean validateHeaders) {
    this.method = prototype.getMethod();
    this.uriEncoder = UriEncoder.uriEncoder(disableUrlEncoding);
    this.uri = prototype.getUri();
    this.address = prototype.getAddress();
    this.localAddress = prototype.getLocalAddress();
    this.headers = new DefaultHttpHeaders(validateHeaders);
    this.headers.add(prototype.getHeaders());
    if (isNonEmpty(prototype.getCookies())) {
        this.cookies = new ArrayList<>(prototype.getCookies());
    }//from   w ww.jav  a2s .  com
    this.byteData = prototype.getByteData();
    this.compositeByteData = prototype.getCompositeByteData();
    this.stringData = prototype.getStringData();
    this.byteBufferData = prototype.getByteBufferData();
    this.streamData = prototype.getStreamData();
    this.bodyGenerator = prototype.getBodyGenerator();
    if (isNonEmpty(prototype.getFormParams())) {
        this.formParams = new ArrayList<>(prototype.getFormParams());
    }
    if (isNonEmpty(prototype.getBodyParts())) {
        this.bodyParts = new ArrayList<>(prototype.getBodyParts());
    }
    this.virtualHost = prototype.getVirtualHost();
    this.proxyServer = prototype.getProxyServer();
    this.realm = prototype.getRealm();
    this.file = prototype.getFile();
    this.followRedirect = prototype.getFollowRedirect();
    this.requestTimeout = prototype.getRequestTimeout();
    this.rangeOffset = prototype.getRangeOffset();
    this.charset = prototype.getCharset();
    this.channelPoolPartitioning = prototype.getChannelPoolPartitioning();
    this.nameResolver = prototype.getNameResolver();
}

From source file:org.jooby.internal.netty.NettyPush.java

License:Apache License

@Override
public void push(final String method, final String path, final Map<String, Object> headers) {
    ctx.channel().eventLoop().execute(() -> {
        AsciiString streamIdHeader = HttpConversionUtil.ExtensionHeaderNames.STREAM_ID.text();
        Http2Connection connection = encoder.connection();
        int nextStreamId = connection.local().incrementAndGetNextStreamId();
        Http2Headers h2headers = new DefaultHttp2Headers().path(path).method(method).authority(authority)
                .scheme(scheme);//from ww w  .j  a  v  a2s .  c om
        headers.forEach((n, v) -> h2headers.add(n, v.toString()));
        encoder.writePushPromise(ctx, streamId, nextStreamId, h2headers, 0, ctx.newPromise());

        // TODO: Is there another way of handling a push promise?
        DefaultFullHttpRequest pushRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1,
                HttpMethod.valueOf(method.toUpperCase()), path, Unpooled.EMPTY_BUFFER,
                new DefaultHttpHeaders(false).set(streamIdHeader, nextStreamId), EmptyHttpHeaders.INSTANCE);
        ctx.pipeline().fireChannelRead(pushRequest);
        ctx.pipeline().fireChannelReadComplete();
    });
}

From source file:ratpack.server.internal.NettyHandlerAdapter.java

License:Apache License

public void channelRead0(final ChannelHandlerContext ctx, final FullHttpRequest nettyRequest) throws Exception {
    if (!nettyRequest.decoderResult().isSuccess()) {
        sendError(ctx, HttpResponseStatus.BAD_REQUEST);
        nettyRequest.release();/*from w  w w  .j  a  va 2s .c  o  m*/
        return;
    }

    final Channel channel = ctx.channel();
    InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
    InetSocketAddress socketAddress = (InetSocketAddress) channel.localAddress();

    final ServerConfig serverConfig = rootRegistry.get(ServerConfig.class);
    final Request request = new DefaultRequest(new NettyHeadersBackedHeaders(nettyRequest.headers()),
            nettyRequest.method(), nettyRequest.uri(), remoteAddress, socketAddress, nettyRequest.content());
    final HttpHeaders nettyHeaders = new DefaultHttpHeaders(false);
    final MutableHeaders responseHeaders = new NettyHeadersBackedMutableHeaders(nettyHeaders);
    final DefaultEventController<RequestOutcome> requestOutcomeEventController = new DefaultEventController<>();
    final AtomicBoolean transmitted = new AtomicBoolean(false);

    final DefaultResponseTransmitter responseTransmitter = new DefaultResponseTransmitter(transmitted,
            execControl, channel, nettyRequest, request, nettyHeaders, requestOutcomeEventController);

    ctx.attr(RESPONSE_TRANSMITTER_ATTRIBUTE_KEY).set(responseTransmitter);

    Action<Action<Object>> subscribeHandler = thing -> {
        transmitted.set(true);
        ctx.attr(CHANNEL_SUBSCRIBER_ATTRIBUTE_KEY).set(thing);
    };

    final DirectChannelAccess directChannelAccess = new DefaultDirectChannelAccess(channel, subscribeHandler);

    final DefaultContext.RequestConstants requestConstants = new DefaultContext.RequestConstants(
            applicationConstants, request, directChannelAccess, requestOutcomeEventController.getRegistry());

    final Response response = new DefaultResponse(execControl, responseHeaders, ctx.alloc(),
            responseTransmitter, requestConstants);
    requestConstants.response = response;

    DefaultContext.start(channel.eventLoop(), execController.getControl(), requestConstants, rootRegistry,
            handlers, execution -> {
                if (!transmitted.get()) {
                    Handler lastHandler = requestConstants.handler;
                    StringBuilder description = new StringBuilder();
                    description.append("No response sent for ").append(request.getMethod().getName())
                            .append(" request to ").append(request.getUri()).append(" (last handler: ");

                    if (lastHandler instanceof DescribingHandler) {
                        ((DescribingHandler) lastHandler).describeTo(description);
                    } else {
                        DescribingHandlers.describeTo(lastHandler, description);
                    }

                    description.append(")");
                    String message = description.toString();
                    LOGGER.warn(message);

                    response.status(500);

                    if (serverConfig.isDevelopment()) {
                        response.send(message);
                    } else {
                        response.send();
                    }
                }
            });
}