Home / Class/ Http3ToHttpHeaderTranslator Class — netty Architecture

Http3ToHttpHeaderTranslator Class — netty Architecture

Architecture documentation for the Http3ToHttpHeaderTranslator class in HttpConversionUtil.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  3b111612_c787_0980_aee4_23cd89bf1539["Http3ToHttpHeaderTranslator"]
  1a4f7f93_6e79_9632_0c1b_8bc1d1399605["HttpConversionUtil.java"]
  3b111612_c787_0980_aee4_23cd89bf1539 -->|defined in| 1a4f7f93_6e79_9632_0c1b_8bc1d1399605
  97b37f55_7e10_b46a_b77c_30470bd39cf4["Http3ToHttpHeaderTranslator()"]
  3b111612_c787_0980_aee4_23cd89bf1539 -->|method| 97b37f55_7e10_b46a_b77c_30470bd39cf4
  3c2f1ac6_32d0_a245_aca6_64f7bbfc50dd["translateHeaders()"]
  3b111612_c787_0980_aee4_23cd89bf1539 -->|method| 3c2f1ac6_32d0_a245_aca6_64f7bbfc50dd

Relationship Graph

Source Code

codec-http3/src/main/java/io/netty/handler/codec/http3/HttpConversionUtil.java lines 570–641

    private static final class Http3ToHttpHeaderTranslator {
        /**
         * Translations from HTTP/3 header name to the HTTP/1.x equivalent.
         */
        private static final CharSequenceMap<AsciiString>
            REQUEST_HEADER_TRANSLATIONS = new CharSequenceMap<AsciiString>();
        private static final CharSequenceMap<AsciiString>
            RESPONSE_HEADER_TRANSLATIONS = new CharSequenceMap<AsciiString>();
        static {
            RESPONSE_HEADER_TRANSLATIONS.add(Http3Headers.PseudoHeaderName.AUTHORITY.value(),
                            HttpHeaderNames.HOST);
            RESPONSE_HEADER_TRANSLATIONS.add(Http3Headers.PseudoHeaderName.SCHEME.value(),
                            ExtensionHeaderNames.SCHEME.text());
            REQUEST_HEADER_TRANSLATIONS.add(RESPONSE_HEADER_TRANSLATIONS);
            RESPONSE_HEADER_TRANSLATIONS.add(Http3Headers.PseudoHeaderName.PATH.value(),
                            ExtensionHeaderNames.PATH.text());
        }

        private final long streamId;
        private final HttpHeaders output;
        private final CharSequenceMap<AsciiString> translations;

        /**
         * Create a new instance
         *
         * @param output The HTTP/1.x headers object to store the results of the translation
         * @param request if {@code true}, translates headers using the request translation map. Otherwise uses the
         *        response translation map.
         */
        Http3ToHttpHeaderTranslator(long streamId, HttpHeaders output, boolean request) {
            this.streamId = streamId;
            this.output = output;
            translations = request ? REQUEST_HEADER_TRANSLATIONS : RESPONSE_HEADER_TRANSLATIONS;
        }

        void translateHeaders(Iterable<Entry<CharSequence, CharSequence>> inputHeaders) throws Http3Exception {
            // lazily created as needed
            StringBuilder cookies = null;

            for (Entry<CharSequence, CharSequence> entry : inputHeaders) {
                final CharSequence name = entry.getKey();
                final CharSequence value = entry.getValue();
                AsciiString translatedName = translations.get(name);
                if (translatedName != null) {
                    output.add(translatedName, AsciiString.of(value));
                } else if (!Http3Headers.PseudoHeaderName.isPseudoHeader(name)) {
                    // https://tools.ietf.org/html/rfc7540#section-8.1.2.3
                    // All headers that start with ':' are only valid in HTTP/3 context
                    if (name.length() == 0 || name.charAt(0) == ':') {
                        throw streamError(streamId, Http3ErrorCode.H3_MESSAGE_ERROR,
                                "Invalid HTTP/3 header '" + name + "' encountered in translation to HTTP/1.x",
                                null);
                    }
                    if (COOKIE.equals(name)) {
                        // combine the cookie values into 1 header entry.
                        // https://tools.ietf.org/html/rfc7540#section-8.1.2.5
                        if (cookies == null) {
                            cookies = InternalThreadLocalMap.get().stringBuilder();
                        } else if (cookies.length() > 0) {
                            cookies.append("; ");
                        }
                        cookies.append(value);
                    } else {
                        output.add(name, value);
                    }
                }
            }
            if (cookies != null) {
                output.add(COOKIE, cookies.toString());
            }
        }
    }

Frequently Asked Questions

What is the Http3ToHttpHeaderTranslator class?
Http3ToHttpHeaderTranslator is a class in the netty codebase, defined in codec-http3/src/main/java/io/netty/handler/codec/http3/HttpConversionUtil.java.
Where is Http3ToHttpHeaderTranslator defined?
Http3ToHttpHeaderTranslator is defined in codec-http3/src/main/java/io/netty/handler/codec/http3/HttpConversionUtil.java at line 570.

Analyze Your Own Codebase

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

Try Supermodel Free