예제 #1
0
            static Http2ToHttpHeaderTranslator()
            {
                RequestHeaderTranslations  = new CharSequenceMap <AsciiString>();
                ResponseHeaderTranslations = new CharSequenceMap <AsciiString>();

                _ = ResponseHeaderTranslations.Add(PseudoHeaderName.Authority.Value, HttpHeaderNames.Host);
                _ = ResponseHeaderTranslations.Add(PseudoHeaderName.Scheme.Value, ExtensionHeaderNames.Scheme);
                _ = RequestHeaderTranslations.Add(ResponseHeaderTranslations);
                _ = ResponseHeaderTranslations.Add(PseudoHeaderName.Path.Value, ExtensionHeaderNames.Path);
            }
예제 #2
0
        static PseudoHeaderName()
        {
            Method    = new PseudoHeaderName(":method", true);
            Scheme    = new PseudoHeaderName(":scheme", true);
            Authority = new PseudoHeaderName(":authority", true);
            Path      = new PseudoHeaderName(":path", true);
            Status    = new PseudoHeaderName(":status", false);
            All       = new PseudoHeaderName[] { Method, Scheme, Authority, Path, Status };

            PseudoHeaders = new CharSequenceMap <PseudoHeaderName>();
            foreach (PseudoHeaderName pseudoHeader in All)
            {
                _ = PseudoHeaders.Add(pseudoHeader._value, pseudoHeader);
            }
        }
예제 #3
0
 static HttpConversionUtil()
 {
     HttpToHttp2HeaderBlacklist = new CharSequenceMap <AsciiString>
     {
         { HttpHeaderNames.Connection, AsciiString.Empty },
         { HttpHeaderNames.KeepAlive, AsciiString.Empty },
         { HttpHeaderNames.ProxyConnection, AsciiString.Empty },
         { HttpHeaderNames.TransferEncoding, AsciiString.Empty },
         { HttpHeaderNames.Host, AsciiString.Empty },
         { HttpHeaderNames.Upgrade, AsciiString.Empty },
         { ExtensionHeaderNames.StreamId, AsciiString.Empty },
         { ExtensionHeaderNames.Scheme, AsciiString.Empty },
         { ExtensionHeaderNames.Path, AsciiString.Empty }
     };
 }
예제 #4
0
        /// <summary>
        /// create a map CharSequenceMap header name to index value to allow quick lookup
        /// </summary>
        static CharSequenceMap <int> CreateMap()
        {
            int length = StaticTable.Length;
            CharSequenceMap <int> ret = new CharSequenceMap <int>(true, UnsupportedValueConverter <int> .Instance, length);

            // Iterate through the static table in reverse order to
            // save the smallest index for a given name in the map.
            for (int index = length; index > 0; index--)
            {
                HpackHeaderField entry = GetEntry(index);
                ICharSequence    name  = entry._name;
                _ = ret.Set(name, index);
            }

            return(ret);
        }
예제 #5
0
        private static CharSequenceMap <AsciiString> ToLowercaseMap(IEnumerable <ICharSequence> values, int arraySizeHint)
        {
            var valueConverter = UnsupportedValueConverter <AsciiString> .Instance;
            var result         = new CharSequenceMap <AsciiString>(true, valueConverter, arraySizeHint);

            foreach (var item in values)
            {
                AsciiString lowerCased = AsciiString.Of(item).ToLowerCase();
                try
                {
                    int index = lowerCased.ForEachByte(ByteProcessor.FindComma);
                    if (index != -1)
                    {
                        int start = 0;
                        do
                        {
                            _     = result.Add(lowerCased.SubSequence(start, index, false).Trim(), AsciiString.Empty);
                            start = index + 1;
                        } while (start < lowerCased.Count &&
                                 (index = lowerCased.ForEachByte(start, lowerCased.Count - start, ByteProcessor.FindComma)) != -1);
                        _ = result.Add(lowerCased.SubSequence(start, lowerCased.Count, false).Trim(), AsciiString.Empty);
                    }
                    else
                    {
                        _ = result.Add(lowerCased.Trim(), AsciiString.Empty);
                    }
                }
                catch (Exception)
                {
                    // This is not expect to happen because FIND_COMMA never throws but must be caught
                    // because of the ByteProcessor interface.
                    ThrowHelper.ThrowInvalidOperationException();
                }
            }

            return(result);
        }
예제 #6
0
        static HpackStaticTable()
        {
            StaticTable = new[]
            {
                /*  1 */ NewEmptyHeaderField(":authority"),
                /*  2 */ NewHeaderField(":method", "GET"),
                /*  3 */ NewHeaderField(":method", "POST"),
                /*  4 */ NewHeaderField(":path", "/"),
                /*  5 */ NewHeaderField(":path", "/index.html"),
                /*  6 */ NewHeaderField(":scheme", "http"),
                /*  7 */ NewHeaderField(":scheme", "https"),
                /*  8 */ NewHeaderField(":status", "200"),
                /*  9 */ NewHeaderField(":status", "204"),
                /* 10 */ NewHeaderField(":status", "206"),
                /* 11 */ NewHeaderField(":status", "304"),
                /* 12 */ NewHeaderField(":status", "400"),
                /* 13 */ NewHeaderField(":status", "404"),
                /* 14 */ NewHeaderField(":status", "500"),
                /* 15 */ NewEmptyHeaderField("accept-charset"),
                /* 16 */ NewHeaderField("accept-encoding", "gzip, deflate"),
                /* 17 */ NewEmptyHeaderField("accept-language"),
                /* 18 */ NewEmptyHeaderField("accept-ranges"),
                /* 19 */ NewEmptyHeaderField("accept"),
                /* 20 */ NewEmptyHeaderField("access-control-allow-origin"),
                /* 21 */ NewEmptyHeaderField("age"),
                /* 22 */ NewEmptyHeaderField("allow"),
                /* 23 */ NewEmptyHeaderField("authorization"),
                /* 24 */ NewEmptyHeaderField("cache-control"),
                /* 25 */ NewEmptyHeaderField("content-disposition"),
                /* 26 */ NewEmptyHeaderField("content-encoding"),
                /* 27 */ NewEmptyHeaderField("content-language"),
                /* 28 */ NewEmptyHeaderField("content-length"),
                /* 29 */ NewEmptyHeaderField("content-location"),
                /* 30 */ NewEmptyHeaderField("content-range"),
                /* 31 */ NewEmptyHeaderField("content-type"),
                /* 32 */ NewEmptyHeaderField("cookie"),
                /* 33 */ NewEmptyHeaderField("date"),
                /* 34 */ NewEmptyHeaderField("etag"),
                /* 35 */ NewEmptyHeaderField("expect"),
                /* 36 */ NewEmptyHeaderField("expires"),
                /* 37 */ NewEmptyHeaderField("from"),
                /* 38 */ NewEmptyHeaderField("host"),
                /* 39 */ NewEmptyHeaderField("if-match"),
                /* 40 */ NewEmptyHeaderField("if-modified-since"),
                /* 41 */ NewEmptyHeaderField("if-none-match"),
                /* 42 */ NewEmptyHeaderField("if-range"),
                /* 43 */ NewEmptyHeaderField("if-unmodified-since"),
                /* 44 */ NewEmptyHeaderField("last-modified"),
                /* 45 */ NewEmptyHeaderField("link"),
                /* 46 */ NewEmptyHeaderField("location"),
                /* 47 */ NewEmptyHeaderField("max-forwards"),
                /* 48 */ NewEmptyHeaderField("proxy-authenticate"),
                /* 49 */ NewEmptyHeaderField("proxy-authorization"),
                /* 50 */ NewEmptyHeaderField("range"),
                /* 51 */ NewEmptyHeaderField("referer"),
                /* 52 */ NewEmptyHeaderField("refresh"),
                /* 53 */ NewEmptyHeaderField("retry-after"),
                /* 54 */ NewEmptyHeaderField("server"),
                /* 55 */ NewEmptyHeaderField("set-cookie"),
                /* 56 */ NewEmptyHeaderField("strict-transport-security"),
                /* 57 */ NewEmptyHeaderField("transfer-encoding"),
                /* 58 */ NewEmptyHeaderField("user-agent"),
                /* 59 */ NewEmptyHeaderField("vary"),
                /* 60 */ NewEmptyHeaderField("via"),
                /* 61 */ NewEmptyHeaderField("www-authenticate")
            };

            Length = StaticTable.Length;

            StaticIndexByName = CreateMap();
        }
예제 #7
0
 public Http2ToHttpHeaderTranslator(int streamId, HttpHeaders output, bool request)
 {
     _streamId     = streamId;
     _output       = output;
     _translations = request ? RequestHeaderTranslations : ResponseHeaderTranslations;
 }