001/**
002 * Copyright (C) 2006-2018 Talend Inc. - www.talend.com
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.talend.sdk.component.junit.http.internal.impl;
017
018import org.talend.sdk.component.junit.http.api.HttpApiHandler;
019
020import io.netty.channel.ChannelInboundHandlerAdapter;
021import io.netty.channel.ChannelInitializer;
022import io.netty.channel.ChannelPipeline;
023import io.netty.channel.socket.SocketChannel;
024import io.netty.handler.codec.http.HttpContentCompressor;
025import io.netty.handler.codec.http.HttpContentDecompressor;
026import io.netty.handler.codec.http.HttpObjectAggregator;
027import io.netty.handler.codec.http.HttpRequestDecoder;
028import io.netty.handler.codec.http.HttpResponseEncoder;
029import io.netty.handler.codec.http.HttpServerKeepAliveHandler;
030import io.netty.handler.logging.LogLevel;
031import io.netty.handler.logging.LoggingHandler;
032import io.netty.handler.stream.ChunkedWriteHandler;
033
034import lombok.AllArgsConstructor;
035
036@AllArgsConstructor
037public class ProxyInitializer extends ChannelInitializer<SocketChannel> {
038
039    private final HttpApiHandler api;
040
041    @Override
042    protected void initChannel(final SocketChannel channel) {
043        final ChannelPipeline pipeline = channel.pipeline();
044        final ChannelInboundHandlerAdapter handler;
045        final boolean degzip;
046        if (Handlers.isActive("capture")) {
047            degzip = true;
048            handler = new DefaultResponseLocatorCapturingHandler(api);
049        } else if (Handlers.isActive("passthrough")) {
050            degzip = false;
051            handler = new PassthroughHandler(api);
052        } else {
053            degzip = true;
054            handler = new ServingProxyHandler(api);
055        }
056        pipeline.addLast("logging", new LoggingHandler(LogLevel.valueOf(api.getLogLevel()))).addLast("http-decoder",
057                new HttpRequestDecoder());
058        if (degzip) {
059            pipeline.addLast("gzip-decompressor", new HttpContentDecompressor());
060        }
061        pipeline
062                .addLast("http-encoder", new HttpResponseEncoder())
063                .addLast("gzip-compressor", new HttpContentCompressor())
064                .addLast("http-keepalive", new HttpServerKeepAliveHandler())
065                .addLast("aggregator", new HttpObjectAggregator(Integer.MAX_VALUE))
066                .addLast("chunked-writer", new ChunkedWriteHandler())
067                .addLast("talend-junit-api-server", handler);
068    }
069}