Home / Class/ CorsHandler Class — netty Architecture

CorsHandler Class — netty Architecture

Architecture documentation for the CorsHandler class in CorsHandler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  48d2af19_d0e9_a2f5_8280_607eb2335be4["CorsHandler"]
  9d37344e_3c17_c372_7c20_655568ee541c["CorsHandler.java"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|defined in| 9d37344e_3c17_c372_7c20_655568ee541c
  cdd15bb6_b29c_2cdf_d4c6_229d1d89d815["CorsHandler()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| cdd15bb6_b29c_2cdf_d4c6_229d1d89d815
  027a5736_cffb_b2ba_1d21_bab8955f01f6["channelRead()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 027a5736_cffb_b2ba_1d21_bab8955f01f6
  a3528954_dd41_114c_963f_7d9056bea918["handlePreflight()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| a3528954_dd41_114c_963f_7d9056bea918
  95c218d3_1c82_797e_8203_47f2c7d44e6a["setPreflightHeaders()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 95c218d3_1c82_797e_8203_47f2c7d44e6a
  9baaa477_e3b4_9f0a_b3ae_b8d686d67a05["CorsConfig()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 9baaa477_e3b4_9f0a_b3ae_b8d686d67a05
  443bc456_062e_6158_b794_7d52bf18c800["setOrigin()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 443bc456_062e_6158_b794_7d52bf18c800
  77dbe6d0_a985_c376_24e3_276a343b55c7["echoRequestOrigin()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 77dbe6d0_a985_c376_24e3_276a343b55c7
  97c0ae02_8802_ee09_1971_d1ef0b1db82c["setVaryHeader()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 97c0ae02_8802_ee09_1971_d1ef0b1db82c
  bf446f18_42d8_aaab_2a6e_04a99bb4b179["setAnyOrigin()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| bf446f18_42d8_aaab_2a6e_04a99bb4b179
  958e1896_1b91_bbf4_ba96_e358efbfb976["setNullOrigin()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 958e1896_1b91_bbf4_ba96_e358efbfb976
  d0b437b7_a674_7261_9478_519e18bcedff["setAllowCredentials()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| d0b437b7_a674_7261_9478_519e18bcedff
  9d53585d_ffbc_c503_7ed7_7772002f41b2["isPreflightRequest()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 9d53585d_ffbc_c503_7ed7_7772002f41b2
  2f9be2d2_ca57_b53c_0e43_e64bbb04376b["setExposeHeaders()"]
  48d2af19_d0e9_a2f5_8280_607eb2335be4 -->|method| 2f9be2d2_ca57_b53c_0e43_e64bbb04376b

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/http/cors/CorsHandler.java lines 53–288

public class CorsHandler extends ChannelDuplexHandler {

    private static final InternalLogger logger = InternalLoggerFactory.getInstance(CorsHandler.class);
    private static final String ANY_ORIGIN = "*";
    private static final String NULL_ORIGIN = "null";
    private CorsConfig config;

    private HttpRequest request;
    private final List<CorsConfig> configList;
    private final boolean isShortCircuit;
    private boolean consumeContent;

    /**
     * Creates a new instance with a single {@link CorsConfig}.
     */
    public CorsHandler(final CorsConfig config) {
        this(Collections.singletonList(checkNotNull(config, "config")), config.isShortCircuit());
    }

    /**
     * Creates a new instance with the specified config list. If more than one
     * config matches a certain origin, the first in the List will be used.
     *
     * @param configList     List of {@link CorsConfig}
     * @param isShortCircuit Same as {@link CorsConfig#isShortCircuit} but applicable to all supplied configs.
     */
    public CorsHandler(final List<CorsConfig> configList, boolean isShortCircuit) {
        checkNonEmpty(configList, "configList");
        this.configList = configList;
        this.isShortCircuit = isShortCircuit;
    }

    @Override
    public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception {
        if (msg instanceof HttpRequest) {
            request = (HttpRequest) msg;
            final String origin = request.headers().get(HttpHeaderNames.ORIGIN);
            config = getForOrigin(origin);
            if (isPreflightRequest(request)) {
                handlePreflight(ctx, request);
                // Enable consumeContent so that all following HttpContent
                // for this request will be released and not propagated downstream.
                consumeContent = true;
                return;
            }
            if (isShortCircuit && !(origin == null || config != null)) {
                forbidden(ctx, request);
                consumeContent = true;
                return;
            }

            // This request is forwarded, stop discarding
            consumeContent = false;
            ctx.fireChannelRead(msg);
            return;
        }

        if (consumeContent && (msg instanceof HttpContent)) {
            ReferenceCountUtil.release(msg);
            return;
        }

        ctx.fireChannelRead(msg);
    }

    private void handlePreflight(final ChannelHandlerContext ctx, final HttpRequest request) {
        final HttpResponse response = new DefaultFullHttpResponse(
                request.protocolVersion(),
                OK,
                Unpooled.buffer(0),
                DefaultHttpHeadersFactory.headersFactory().withCombiningHeaders(true),
                DefaultHttpHeadersFactory.trailersFactory().withCombiningHeaders(true));
        if (setOrigin(response)) {
            setAllowMethods(response);
            setAllowHeaders(response);
            setAllowCredentials(response);
            setMaxAge(response);
            setPreflightHeaders(response);
            setAllowPrivateNetwork(response);
        }
        if (!response.headers().contains(HttpHeaderNames.CONTENT_LENGTH)) {

Frequently Asked Questions

What is the CorsHandler class?
CorsHandler is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/cors/CorsHandler.java.
Where is CorsHandler defined?
CorsHandler is defined in codec-http/src/main/java/io/netty/handler/codec/http/cors/CorsHandler.java at line 53.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free