public void StringSegment_IndexOfString_ReturnsCorrectValueForExistingCharacter()
        {
            var segment = new StringSegment("Hello, world!");
            var result = segment.IndexOf("world");

            TheResultingValue(result).ShouldBe(7);
        }
示例#2
0
 public void CharReaderFromSegment()
 {
     var segment = new StringSegment(TestContent);
     var reader = new CharReader(segment);
     Assert.False(reader.IsDone);
     Assert.Equal(-1, reader.Position);
 }
示例#3
0
 public void Null()
 {
     var segment = new StringSegment(null);
     Assert.Equal(0, segment.Length);
     Assert.True(segment.IsEmpty);
     Assert.True(segment.IsNull);
 }
        public void StringSegment_IndexOfString_ReturnsNegativeOneForNonExistingCharacter()
        {
            var segment = new StringSegment("Hello, world!");
            var result = segment.IndexOf("zorld");

            TheResultingValue(result).ShouldBe(-1);
        }
示例#5
0
 public void Empty()
 {
     var segment = new StringSegment("");
     Assert.Equal(0, segment.Length);
     Assert.True(segment.IsEmpty);
     Assert.False(segment.IsNull);
 }
示例#6
0
        public void FormatFilter_ContextContainsFormat_DefaultFormat(
            string format,
            FormatSource place,
            string contentType)
        {
            // Arrange
            var mediaType = new StringSegment("application/json");
            var mockObjects = new MockObjects(format, place);

            var resultExecutingContext = mockObjects.CreateResultExecutingContext();
            var resourceExecutingContext = mockObjects.CreateResourceExecutingContext(new IFilterMetadata[] { });

            var filter = new FormatFilter(mockObjects.OptionsManager);

            // Act
            filter.OnResourceExecuting(resourceExecutingContext);

            // Assert
            Assert.Null(resourceExecutingContext.Result);

            // Act
            filter.OnResultExecuting(resultExecutingContext);

            // Assert
            var objectResult = Assert.IsType<ObjectResult>(resultExecutingContext.Result);
            Assert.Equal(1, objectResult.ContentTypes.Count);
            MediaTypeAssert.Equal(mediaType, objectResult.ContentTypes[0]);
        }
示例#7
0
 public void CharReaderShouldReadToCharacter()
 {
     StringSegment source = new StringSegment("abc:123");
     CharReader reader = new CharReader(source);
     reader.ReadTo(':', false);
     Assert.Equal(3, reader.Position);
 }
        /// <summary>
        /// Converts the hexadecimal text of the specified <see cref="StringSegment"/> to an 
        /// instance of <see cref="Int32"/> if possible.
        /// </summary>
        /// <param name="segment">The string segment to convert.</param>
        /// <param name="result">The converted value.</param>
        /// <returns><see langword="true"/> if the conversion succeeded; otherwise, <see langword="false"/>.</returns>
        public static Boolean TryParseHexadecimalInt32(StringSegment segment, out Int32 result)
        {
            var spaceCountLeading = CountLeadingSpace(ref segment);
            var spaceCountTrailing = CountTrailingSpace(ref segment);

            var valueStart = spaceCountLeading;
            var valueLength = segment.Length - (spaceCountLeading + spaceCountTrailing);

            var magnitude = (Int64)Math.Pow(16, valueLength - 1);
            var digit = 0;
            var total = 0L;
            for (int i = 0; i < valueLength; i++)
            {
                if (!ConvertHexadecimalDigit(segment[valueStart + i], out digit))
                {
                    result = 0;
                    return false;
                }

                total += (magnitude * digit);
                magnitude /= 16;
            }

            if (total > Int32.MaxValue)
                throw new OverflowException();

            result = (Int32)total;
            return true;
        }
示例#9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="StringSource"/> structure.
 /// </summary>
 /// <param name="segment">The <see cref="StringSegment"/> that contains the string data.</param>
 public StringSource(StringSegment segment)
 {
     this.str     = segment.SourceString;
     this.builder = segment.SourceStringBuilder;
     this.Start   = segment.Start;
     this.Length  = segment.Length;
 }
        public static UInt32 ParseUInt32(StringSegment segment)
        {
            UInt32 value;
            if (!TryParseUInt32(segment, out value))
                throw new FormatException();

            return value;
        }
        public void StringSegment_CanBeCreatedFromString()
        {
            var source = "Hello, world!";
            var segment = new StringSegment(source, 2, 4);

            TheResultingString(segment.ToString())
                .ShouldBe("llo,");
        }
示例#12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TextParserToken"/> structure.
 /// </summary>
 /// <param name="tokenType">The token's type.</param>
 /// <param name="text">The token's text.</param>
 /// <param name="sourceOffset">The offset of the first character in the source text that produced this token.</param>
 /// <param name="sourceLength">The number of characters in the source text that produced this token.</param>
 /// <param name="isNonBreakingSpace">A value indicating whether this token represents a non-breaking space.</param>
 internal TextParserToken(TextParserTokenType tokenType, StringSegment text, Int32 sourceOffset, Int32 sourceLength, Boolean isNonBreakingSpace = false)
 {
     this.tokenType = tokenType;
     this.text = text;
     this.sourceOffset = sourceOffset;
     this.sourceLength = sourceLength;
     this.isNonBreakingSpace = isNonBreakingSpace;
 }
示例#13
0
        public void DefaultConstructor()
        {
            var segment = new StringSegment();
            Assert.Equal(0, segment.Length);

            Assert.True(segment.IsEmpty);
            Assert.True(segment.IsNull);
        }
示例#14
0
 public void NoRunFactories()
 {
     WikiRunParser parser = new WikiRunParser(Enumerable.Empty<WikiRunFactory>());
     StringSegment text = new StringSegment("we're");
     List<WikiRun> runs = parser.Parse(text).ToList();
     Assert.AreEqual(1, runs.Count);
     Assert.AreEqual("we're", ((TextWikiRun) runs[0]).Text);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="StringFormatterCommandInfo"/> structure.
 /// </summary>
 /// <param name="commandName">The name of the command being handled.</param>
 /// <param name="commandArgs">The command's argument list.</param>
 /// <param name="commandHandler">The command's handler.</param>
 public StringFormatterCommandInfo(StringSegment commandName, 
     StringFormatterCommandArguments commandArgs,
     StringFormatterCommandHandler commandHandler)
 {
     this.CommandName = commandName;
     this.CommandArguments = commandArgs;
     this.CommandHandler = commandHandler;
 }
 public void EqualMatchesEntireSubstring()
 {
     var segment = new StringSegment("abcdefghij", 2, 6);
     segment.Equals("cdefgh", StringComparison.Ordinal).ShouldBe(true);
     segment.Equals("cdefg", StringComparison.Ordinal).ShouldBe(false);
     segment.Equals("cdefghi", StringComparison.Ordinal).ShouldBe(false);
     segment.Equals("cDefgh", StringComparison.Ordinal).ShouldBe(false);
     segment.Equals("cDefgh", StringComparison.OrdinalIgnoreCase).ShouldBe(true);
 }
示例#17
0
        private WikiRun FindRunInText(StringSegment text)
        {
            Match match = text.Match(m_regex);
            for (int runFactoryIndex = 0; runFactoryIndex < m_runFactories.Count; runFactoryIndex++)
                if (match.Groups["z" + runFactoryIndex].Success)
                    return m_runFactories[runFactoryIndex].Parse(text, match);

            return null;
        }
示例#18
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TextLayoutToken"/> structure.
 /// </summary>
 /// <param name="text">The token's text.</param>
 /// <param name="bounds">The token's bounds relative to its layout region.</param>
 /// <param name="fontFace">The token's font face.</param>
 /// <param name="icon">The token's icon.</param>
 /// <param name="glyphShader">The token's glyph shader.</param>
 /// <param name="color">The token's color.</param>
 internal TextLayoutToken(StringSegment text, Rectangle bounds, SpriteFontFace fontFace, TextIconInfo? icon, GlyphShader glyphShader, Color? color)
 {
     this.text = text;
     this.bounds = bounds;
     this.fontFace = fontFace;
     this.icon = icon;
     this.glyphShader = glyphShader;
     this.color = color;
 }
示例#19
0
 public void BodyFromStringSegmentShouldHaveMatchingText()
 {
     string s = "abcHello, worlddef";
     string bText = "Hello, world";
     StringSegment ss = new StringSegment(s, 3, 14);
     Body b = new Body(ss);
     Assert.Equal(bText, b.Text);
     Assert.Equal(bText, b.SourceText.ToString());
     Assert.Equal(bText, b.ToString());
 }
示例#20
0
 public void Contraction()
 {
     StringSegment text = new StringSegment("we're");
     List<WikiRun> runs = m_parser.Parse(text).ToList();
     int runIndex = 0;
     Assert.AreEqual("we", ((TextWikiRun) runs[runIndex++]).Text);
     Assert.AreEqual(SmartQuoteWikiRun.RightSingleQuote, ((SmartQuoteWikiRun) runs[runIndex++]).SmartQuote);
     Assert.AreEqual("re", ((TextWikiRun) runs[runIndex++]).Text);
     Assert.AreEqual(runIndex, runs.Count);
 }
示例#21
0
        public void StringSegment_StringCtor_AllowsNullBuffers()
        {
            // Arrange & Act
            var segment = new StringSegment(null);

            // Assert
            Assert.False(segment.HasValue);
            Assert.Equal(0, segment.Offset);
            Assert.Equal(0, segment.Length);
        }
示例#22
0
        public void StringSegment_HasValue_Invalid()
        {
            // Arrange
            var segment = new StringSegment();

            // Act
            var hasValue = segment.HasValue;

            // Assert
            Assert.False(hasValue);
        }
示例#23
0
        public void PathTokenizer_Count(string path, StringSegment[] expectedSegments)
        {
            // Arrange
            var tokenizer = new PathTokenizer(new PathString(path));

            // Act
            var count = tokenizer.Count;

            // Assert
            Assert.Equal(expectedSegments.Length, count);
        }
示例#24
0
 /// <summary>
 /// Gets a value indicating whether the string has the specified property.
 /// </summary>
 /// <param name="prop">The name of the property to evaluate.</param>
 /// <returns><c>true</c> if the string has the specified property; otherwise, <c>false</c>.</returns>
 public Boolean HasPropertyRef(ref StringSegment prop)
 {
     foreach (var kvp in properties)
     {
         if (prop.Equals(kvp.Key))
         {
             return true;
         }
     }
     return false;
 }
示例#25
0
        public void StringSegment_Value_Invalid()
        {
            // Arrange
            var segment = new StringSegment();

            // Act
            var value = segment.Value;

            // Assert
            Assert.Null(value);
        }
            /// <inheritdoc/>
            public override void HandleCommandLocalizedString(StringFormatter formatter,
                StringBuilder output, StringSegment command, StringFormatterCommandArguments arguments, LocalizedString value)
            {
                if (value == null)
                    throw new FormatException(NucleusStrings.FmtCmdInvalidForGeneratedStrings.Format("variant"));

                var variantName = arguments.GetArgument(0).Text;
                var variant = value.GetVariant(ref variantName);

                output.Append(variant);
            }
示例#27
0
        public void StringSegment_Value_Valid()
        {
            // Arrange
            var segment = new StringSegment("Hello, World!", 1, 4);

            // Act
            var value = segment.Value;

            // Assert
            Assert.Equal("ello", value);
        }
示例#28
0
        public void StringSegment_HasValue_Valid()
        {
            // Arrange
            var segment = new StringSegment("Hello, World!", 1, 4);

            // Act
            var hasValue = segment.HasValue;

            // Assert
            Assert.True(hasValue);
        }
示例#29
0
 public void Segmented(string content, int start, int end, string expectedSegment)
 {
     var segment = new StringSegment(content, start, end);
     Assert.Equal(end, segment.EndIndex);
     Assert.False(segment.IsEmpty);
     Assert.False(segment.IsNull);
     Assert.Equal(expectedSegment.Length, segment.Length);
     Assert.Equal(TestContent, segment.Source);
     Assert.Equal(start, segment.StartIndex);
     Assert.Equal(expectedSegment, segment.ToString());
 }
        public static void AppendSegment(this StringBuilder sb, StringSegment value)
        {
            Contract.Require(sb, nameof(sb));

            if (value.IsEmpty)
                return;

            for (int i = 0; i < value.Length ; i++)
            {
                sb.Append(value[i]);
            }
        }
示例#31
0
 private bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition)
 {
     // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg"
     return(contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") &&
            (!StringSegment.IsNullOrEmpty(contentDisposition.FileName) || !StringSegment.IsNullOrEmpty(contentDisposition.FileNameStar)));
 }
        /// <inheritdoc />
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (next == null)
            {
                throw new ArgumentNullException(nameof(next));
            }

            var request = context.HttpContext.Request;

            if (HttpMethods.IsPost(request.Method))
            {
                // 1. Confirm a secure connection.
                var errorResult = EnsureSecureConnection(ReceiverName, context.HttpContext.Request);
                if (errorResult != null)
                {
                    context.Result = errorResult;
                    return;
                }

                // 2. Get the expected hash from the signature header.
                var header = GetRequestHeader(request, GitHubConstants.SignatureHeaderName, out errorResult);
                if (errorResult != null)
                {
                    context.Result = errorResult;
                    return;
                }

                var values     = new TrimmingTokenizer(header, PairSeparators);
                var enumerator = values.GetEnumerator();
                enumerator.MoveNext();
                var headerKey = enumerator.Current;
                if (values.Count != 2 ||
                    !StringSegment.Equals(
                        headerKey,
                        GitHubConstants.SignatureHeaderKey,
                        StringComparison.OrdinalIgnoreCase))
                {
                    Logger.LogWarning(
                        0,
                        $"Invalid '{GitHubConstants.SignatureHeaderName}' header value. Expecting a value of " +
                        $"'{GitHubConstants.SignatureHeaderKey}=<value>'.");

                    var message = string.Format(
                        CultureInfo.CurrentCulture,
                        GitHubConstants.SignatureHeaderName,
                        GitHubConstants.SignatureHeaderKey,
                        "<value>");
                    errorResult = new BadRequestObjectResult(message);

                    context.Result = errorResult;
                    return;
                }

                enumerator.MoveNext();
                var headerValue = enumerator.Current.Value;

                var expectedHash = FromHex(headerValue, GitHubConstants.SignatureHeaderName);
                if (expectedHash == null)
                {
                    context.Result = CreateBadHexEncodingResult(GitHubConstants.SignatureHeaderKey);
                    return;
                }

                // 3. Get the configured secret key.
                var secretKey = Env.GetString("GITHUB_WEBHOOKS_SECRETKEY_DEFAULT");
                if (secretKey == null)
                {
                    context.Result = new NotFoundResult();
                    return;
                }

                var secret = Encoding.UTF8.GetBytes(secretKey);

                // 4. Get the actual hash of the request body.
                var actualHash = await ComputeRequestBodySha1HashAsync(request, secret);

                // 5. Verify that the actual hash matches the expected hash.
                if (!SecretEqual(expectedHash, actualHash))
                {
                    // Log about the issue and short-circuit remainder of the pipeline.
                    errorResult = CreateBadSignatureResult(GitHubConstants.SignatureHeaderName);

                    context.Result = errorResult;
                    return;
                }
            }

            await next();
        }
示例#33
0
        private static bool IsPathCandidateForComponent(DocumentSnapshot documentSnapshot, StringSegment path)
        {
            if (documentSnapshot.FileKind != FileKinds.Component)
            {
                return(false);
            }
            var fileName = Path.GetFileNameWithoutExtension(documentSnapshot.FilePath);

            return(new StringSegment(fileName).Equals(path, FilePathComparison.Instance));
        }
示例#34
0
文件: TrimUtils.cs 项目: cmsd2/oidc
        public static StringSegment Trim(StringSegment segment, char[] separators)
        {
            Debug.Assert(separators?.Length != 0, "The separators collection shouldn't be null or empty.");

            return(TrimEnd(TrimStart(segment, separators), separators));
        }
示例#35
0
 public CommentStatement(StringSegment text)
 {
     Text = text.ToString();
 }
示例#36
0
        private static string ValueWithPrefix(StringSegment prefixSegment, object val)
        {
            var prefix = prefixSegment.Subsegment(0, prefixSegment.Length - 1);

            return((prefix.Length > 0) && (prefix[prefix.Length - 1] != '/') ? null : $"{prefix}{val}");
        }
示例#37
0
        public static void GetDocIdFromInclude(BlittableJsonReaderObject docReader, StringSegment includePath,
                                               HashSet <string> includedIds)
        {
            Func <object, StringSegment, string> valueHandler = null;

            var indexOfPrefixStart = includePath.IndexOfAny(PrefixSeparatorChar, 0);

            StringSegment pathSegment;
            StringSegment?addition = null;

            if (HasSuffixSeparator(includePath, out var indexOfSuffixStart))
            {
                addition = includePath.Subsegment(indexOfSuffixStart + 1);

                if (!addition.Value[addition.Value.Length - 1].Equals(']') ||
                    ((addition.Value.Length >= 4) &&
                     !addition.Value.Subsegment(0, 4).Equals(SuffixStart)))
                {
                    return;
                }
                pathSegment  = includePath.Subsegment(0, indexOfSuffixStart);
                valueHandler = HandleSuffixValue;
            }
            else if (indexOfPrefixStart != -1)
            {
                addition = includePath.Subsegment(indexOfPrefixStart + 1);
                if (!includePath[includePath.Length - 1].Equals(')'))
                {
                    return;
                }
                pathSegment  = includePath.Subsegment(0, indexOfPrefixStart);
                valueHandler = HandlePrefixValue;
            }
            else
            {
                pathSegment = includePath;
            }

            if (BlittableJsonTraverser.Default.TryRead(docReader, pathSegment, out object value, out StringSegment leftPath) == false)
            {
                var json = value as BlittableJsonReaderObject;
                if (json != null)
                {
                    var isKey = leftPath == "$Keys"; // include on dictionary.Keys or dictionary.Values
                    if (isKey || leftPath == "$Values")
                    {
                        var property = new BlittableJsonReaderObject.PropertyDetails();
                        foreach (var propertyIndex in json.GetPropertiesByInsertionOrder())
                        {
                            json.GetPropertyByIndex(propertyIndex, ref property);
                            var val = isKey ? property.Name : property.Value;
                            if (val != null)
                            {
                                includedIds.Add(val.ToString());
                            }
                        }
                    }
                }

                return;
            }

            var collectionOfIds = value as IEnumerable;

            if (collectionOfIds != null)
            {
                foreach (var item in collectionOfIds)
                {
                    if (item == null)
                    {
                        continue;
                    }
                    if (addition != null)
                    {
                        var includedId = valueHandler(item, addition.Value);
                        if (includedId != null)
                        {
                            includedIds.Add(includedId);
                        }
                    }
                    includedIds.Add(BlittableValueToString(item));
                }
            }
            else
            {
                if (addition != null)
                {
                    var includedId = valueHandler(value, addition.Value);
                    if (includedId != null)
                    {
                        includedIds.Add(includedId);
                    }
                }
                includedIds.Add(BlittableValueToString(value));
            }
        }
示例#38
0
 public RangeHeaderValue(long?from, long?to)
 {
     // convenience ctor: "Range: bytes=from-to"
     _unit = HeaderUtilities.BytesUnit;
     Ranges.Add(new RangeItemHeaderValue(from, to));
 }
示例#39
0
 public RangeHeaderValue()
 {
     _unit = HeaderUtilities.BytesUnit;
 }
示例#40
0
        public static StringWithQualityHeaderValue Parse(StringSegment input)
        {
            var index = 0;

            return(SingleValueParser.ParseValue(input, ref index));
        }
示例#41
0
        public static bool TryParse(StringSegment input, out StringWithQualityHeaderValue parsedValue)
        {
            var index = 0;

            return(SingleValueParser.TryParseValue(input, ref index, out parsedValue));
        }
示例#42
0
 public MethodExpression(StringSegment name, List <QueryExpression> arguments)
 {
     Name      = name;
     Arguments = arguments;
     Type      = ExpressionType.Method;
 }
示例#43
0
        // TODO: optimize this method
        internal static List <ProxyRoute> BuildRoutes(Uri serviceName, Dictionary <string, string> labels)
        {
            var backendId = GetClusterId(serviceName, labels);

            var routesNames = new Dictionary <StringSegment, string>();

            foreach (var kvp in labels)
            {
                if (kvp.Key.Length > RoutesLabelsPrefix.Length && kvp.Key.StartsWith(RoutesLabelsPrefix, StringComparison.Ordinal))
                {
                    var suffix          = new StringSegment(kvp.Key).Subsegment(RoutesLabelsPrefix.Length);
                    var routeNameLength = suffix.IndexOf('.');
                    if (routeNameLength == -1)
                    {
                        // No route name encoded, the key is not valid. Throwing would suggest we actually check for all invalid keys, so just ignore.
                        continue;
                    }

                    var routeNameSegment = suffix.Subsegment(0, routeNameLength + 1);
                    if (routesNames.ContainsKey(routeNameSegment))
                    {
                        continue;
                    }

                    var routeName = routeNameSegment.Subsegment(0, routeNameSegment.Length - 1).ToString();
                    if (!_allowedRouteNamesRegex.IsMatch(routeName))
                    {
                        throw new ConfigException($"Invalid route name '{routeName}', should only contain alphanumerical characters, underscores or hyphens.");
                    }
                    routesNames.Add(routeNameSegment, routeName);
                }
            }

            // Build the routes
            var routes = new List <ProxyRoute>(routesNames.Count);

            foreach (var routeNamePair in routesNames)
            {
                string hosts         = null;
                string path          = null;
                int?   order         = null;
                var    metadata      = new Dictionary <string, string>();
                var    headerMatches = new Dictionary <string, RouteHeaderFields>();
                var    transforms    = new Dictionary <string, Dictionary <string, string> >();
                foreach (var kvp in labels)
                {
                    if (!kvp.Key.StartsWith(RoutesLabelsPrefix, StringComparison.Ordinal))
                    {
                        continue;
                    }

                    var routeLabelKey = kvp.Key.AsSpan().Slice(RoutesLabelsPrefix.Length);

                    if (routeLabelKey.Length < routeNamePair.Key.Length || !routeLabelKey.StartsWith(routeNamePair.Key, StringComparison.Ordinal))
                    {
                        continue;
                    }

                    routeLabelKey = routeLabelKey.Slice(routeNamePair.Key.Length);

                    if (ContainsKey("Metadata.", routeLabelKey, out var keyRemainder))
                    {
                        metadata.Add(keyRemainder.ToString(), kvp.Value);
                    }
                    else if (ContainsKey("MatchHeaders.", routeLabelKey, out keyRemainder))
                    {
                        var headerIndexLength = keyRemainder.IndexOf('.');
                        if (headerIndexLength == -1)
                        {
                            // No header encoded, the key is not valid. Throwing would suggest we actually check for all invalid keys, so just ignore.
                            continue;
                        }
                        var headerIndex = keyRemainder.Slice(0, headerIndexLength).ToString();
                        if (!_allowedHeaderNamesRegex.IsMatch(headerIndex))
                        {
                            throw new ConfigException($"Invalid header matching index '{headerIndex}', should only contain alphanumerical characters, underscores or hyphens.");
                        }
                        if (!headerMatches.ContainsKey(headerIndex))
                        {
                            headerMatches.Add(headerIndex, new RouteHeaderFields());
                        }

                        var propertyName = keyRemainder.Slice(headerIndexLength + 1);
                        if (propertyName.Equals("Name", StringComparison.Ordinal))
                        {
                            headerMatches[headerIndex].Name = kvp.Value;
                        }
                        else if (propertyName.Equals("Values", StringComparison.Ordinal))
                        {
#if NET5_0
                            headerMatches[headerIndex].Values = kvp.Value.Split(',', StringSplitOptions.TrimEntries);
#elif NETCOREAPP3_1
                            headerMatches[headerIndex].Values = kvp.Value.Split(',').Select(val => val.Trim()).ToList();
#else
#error A target framework was added to the project and needs to be added to this condition.
#endif
                        }
                        else if (propertyName.Equals("IsCaseSensitive", StringComparison.Ordinal))
                        {
                            headerMatches[headerIndex].IsCaseSensitive = bool.Parse(kvp.Value);
                        }
                        else if (propertyName.Equals("Mode", StringComparison.Ordinal))
                        {
                            headerMatches[headerIndex].Mode = Enum.Parse <HeaderMatchMode>(kvp.Value);
                        }
                        else
                        {
                            throw new ConfigException($"Invalid header matching property '{propertyName.ToString()}', only valid values are Name, Values, IsCaseSensitive and Mode.");
                        }
                    }
                    else if (ContainsKey("Transforms.", routeLabelKey, out keyRemainder))
                    {
                        var transformNameLength = keyRemainder.IndexOf('.');
                        if (transformNameLength == -1)
                        {
                            // No transform index encoded, the key is not valid. Throwing would suggest we actually check for all invalid keys, so just ignore.
                            continue;
                        }
                        var transformName = keyRemainder.Slice(0, transformNameLength).ToString();
                        if (!_allowedTransformNamesRegex.IsMatch(transformName))
                        {
                            throw new ConfigException($"Invalid transform index '{transformName}', should be transform index wrapped in square brackets.");
                        }
                        if (!transforms.ContainsKey(transformName))
                        {
                            transforms.Add(transformName, new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase));
                        }
                        var propertyName = keyRemainder.Slice(transformNameLength + 1).ToString();
                        if (!transforms[transformName].ContainsKey(propertyName))
                        {
                            transforms[transformName].Add(propertyName, kvp.Value);
                        }
                        else
                        {
                            throw new ConfigException($"A duplicate transformation property '{transformName}.{propertyName}' was found.");
                        }
                    }
                    else if (ContainsKey("Hosts", routeLabelKey, out _))
                    {
                        hosts = kvp.Value;
                    }
                    else if (ContainsKey("Path", routeLabelKey, out _))
                    {
                        path = kvp.Value;
                    }
                    else if (ContainsKey("Order", routeLabelKey, out _))
                    {
                        order = ConvertLabelValue <int?>(kvp.Key, kvp.Value);
                    }
                }

                var route = new ProxyRoute
                {
                    RouteId = $"{Uri.EscapeDataString(backendId)}:{Uri.EscapeDataString(routeNamePair.Value)}",
                    Match   = new ProxyMatch
                    {
                        Hosts   = SplitHosts(hosts),
                        Path    = path,
                        Headers = headerMatches.Count > 0 ? headerMatches.Select(hm => new RouteHeader()
                        {
                            Name            = hm.Value.Name,
                            Values          = hm.Value.Values,
                            Mode            = hm.Value.Mode,
                            IsCaseSensitive = hm.Value.IsCaseSensitive,
                        }).ToArray() : null
                    },
                    Order      = order,
                    ClusterId  = backendId,
                    Metadata   = metadata,
                    Transforms = transforms.Count > 0 ? transforms.Select(tr => tr.Value).ToList().AsReadOnly() : null
                };
                routes.Add(route);
            }
            return(routes);
        }
示例#44
0
 public override void VisitSelectFunctionBody(StringSegment func)
 {
     throw new NotSupportedException();
 }
示例#45
0
 private bool HasFormDataContentDisposition(ContentDispositionHeaderValue contentDisposition)
 {
     // Content-Disposition: form-data; name="key";
     return(contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") &&
            StringSegment.IsNullOrEmpty(contentDisposition.FileName) && StringSegment.IsNullOrEmpty(contentDisposition.FileNameStar));
 }
示例#46
0
 public abstract ManifestEntry Traverse(StringSegment segment);
示例#47
0
        internal static int GetRangeItemLength(StringSegment input, int startIndex, out RangeItemHeaderValue parsedValue)
        {
            Contract.Requires(startIndex >= 0);

            // This parser parses number ranges: e.g. '1-2', '1-', '-2'.

            parsedValue = null;

            if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length))
            {
                return(0);
            }

            // Caller must remove leading whitespaces. If not, we'll return 0.
            var current = startIndex;

            // Try parse the first value of a value pair.
            var fromStartIndex = current;
            var fromLength     = HttpRuleParser.GetNumberLength(input, current, false);

            if (fromLength > HttpRuleParser.MaxInt64Digits)
            {
                return(0);
            }

            current = current + fromLength;
            current = current + HttpRuleParser.GetWhitespaceLength(input, current);

            // After the first value, the '-' character must follow.
            if ((current == input.Length) || (input[current] != '-'))
            {
                // We need a '-' character otherwise this can't be a valid range.
                return(0);
            }

            current++; // skip the '-' character
            current = current + HttpRuleParser.GetWhitespaceLength(input, current);

            var toStartIndex = current;
            var toLength     = 0;

            // If we didn't reach the end of the string, try parse the second value of the range.
            if (current < input.Length)
            {
                toLength = HttpRuleParser.GetNumberLength(input, current, false);

                if (toLength > HttpRuleParser.MaxInt64Digits)
                {
                    return(0);
                }

                current = current + toLength;
                current = current + HttpRuleParser.GetWhitespaceLength(input, current);
            }

            if ((fromLength == 0) && (toLength == 0))
            {
                return(0); // At least one value must be provided in order to be a valid range.
            }

            // Try convert first value to int64
            long from = 0;

            if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(fromStartIndex, fromLength), out from))
            {
                return(0);
            }

            // Try convert second value to int64
            long to = 0;

            if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(toStartIndex, toLength), out to))
            {
                return(0);
            }

            // 'from' must not be greater than 'to'
            if ((fromLength > 0) && (toLength > 0) && (from > to))
            {
                return(0);
            }

            parsedValue = new RangeItemHeaderValue((fromLength == 0 ? (long?)null : (long?)from),
                                                   (toLength == 0 ? (long?)null : (long?)to));
            return(current - startIndex);
        }
示例#48
0
        private IActionResult ValidateHeader(string header)
        {
            var hasTimestamp = false;
            var hasSignature = false;
            var pairs        = new TrimmingTokenizer(header, CommaSeparator);

            foreach (var pair in pairs)
            {
                var keyValuePair = new TrimmingTokenizer(pair, EqualSeparator, maxCount: 2);
                if (keyValuePair.Count != 2)
                {
                    // Header is not formatted correctly.
                    Logger.LogWarning(
                        0,
                        $"The '{StripeConstants.SignatureHeaderName}' header value is invalid. '{{InvalidPair}}' " +
                        "should be a 'key=value' pair.",
                        pair);

                    var message = string.Format(
                        CultureInfo.CurrentCulture,
                        Resources.SignatureFilter_InvalidHeaderFormat,
                        StripeConstants.SignatureHeaderName);
                    return(new BadRequestObjectResult(message));
                }

                var enumerator = keyValuePair.GetEnumerator();
                enumerator.MoveNext();

                var key = enumerator.Current;
                if (StringSegment.Equals(key, StripeConstants.SignatureKey, StringComparison.Ordinal))
                {
                    enumerator.MoveNext();
                    hasSignature = !StringSegment.IsNullOrEmpty(enumerator.Current);
                }
                else if (StringSegment.Equals(key, StripeConstants.TimestampKey, StringComparison.Ordinal))
                {
                    enumerator.MoveNext();
                    hasTimestamp = !StringSegment.IsNullOrEmpty(enumerator.Current);
                }
            }

            if (!hasSignature)
            {
                Logger.LogWarning(
                    1,
                    $"The '{StripeConstants.SignatureHeaderName}' header value is invalid. Does not contain a " +
                    $"timestamp ('{StripeConstants.SignatureKey}') value.");
            }

            if (!hasTimestamp)
            {
                Logger.LogWarning(
                    2,
                    $"The '{StripeConstants.SignatureHeaderName}' header value is invalid. Does not contain a " +
                    $"signature ('{StripeConstants.TimestampKey}') value.");
            }

            if (!hasSignature || !hasTimestamp)
            {
                var message = string.Format(
                    CultureInfo.CurrentCulture,
                    Resources.SignatureFilter_HeaderMissingValue,
                    StripeConstants.SignatureHeaderName,
                    StripeConstants.TimestampKey,
                    StripeConstants.SignatureKey);
                return(new BadRequestObjectResult(message));
            }

            // Success
            return(null);
        }
示例#49
0
 public static bool Contains(this StringSegment segment, string str) => Contains(segment, str, StringComparison.Ordinal);
示例#50
0
 public override ManifestEntry Traverse(StringSegment segment) => UnknownPath;
 /// <summary>
 /// Initializes a new instance of the <see cref="GrammerUnknownException"/> class.
 /// </summary>
 /// <param name="unexpectedGrammerStringSegment">The location of the unknown grammer.</param>
 public GrammerUnknownException(StringSegment unexpectedGrammerStringSegment)
     : base(unexpectedGrammerStringSegment, $"Unexpected token '{unexpectedGrammerStringSegment.Value}' found")
 {
     UnexpectedGrammerStringSegment = unexpectedGrammerStringSegment;
 }
示例#52
0
 public static bool Contains(this StringSegment segment, char ch) => segment.IndexOf(ch) != -1;
示例#53
0
 public override void VisitUpdate(StringSegment update)
 {
     throw new NotSupportedException();
 }
示例#54
0
        private static bool TryGetNextSegment(ref StringTokenizer.Enumerator enumerator, out StringSegment segment)
        {
            while (enumerator.MoveNext())
            {
                if (enumerator.Current.HasValue && enumerator.Current.Length > 0)
                {
                    segment = enumerator.Current;
                    return(true);
                }
            }

            segment = default(StringSegment);
            return(false);
        }
示例#55
0
        /// <summary>
        /// Parses <paramref name="input"/> as a <see cref="RangeConditionHeaderValue"/> value.
        /// </summary>
        /// <param name="input">The values to parse.</param>
        /// <returns>The parsed values.</returns>
        public static RangeConditionHeaderValue Parse(StringSegment input)
        {
            var index = 0;

            return(Parser.ParseValue(input, ref index) !);
        }
示例#56
0
    protected override void ExecuteCore(RazorCodeDocument codeDocument, DocumentIntermediateNode documentNode)
    {
        if (codeDocument == null)
        {
            throw new ArgumentNullException(nameof(codeDocument));
        }

        if (documentNode == null)
        {
            throw new ArgumentNullException(nameof(documentNode));
        }

        var @namespace = documentNode.FindPrimaryNamespace();
        var @class     = documentNode.FindPrimaryClass();

        if (@namespace == null || @class == null)
        {
            return;
        }

        var directives = documentNode.FindDirectiveReferences(ComponentPageDirective.Directive);

        if (directives.Count == 0)
        {
            return;
        }

        // We don't allow @page directives in imports
        for (var i = 0; i < directives.Count; i++)
        {
            var directive = directives[i];
            if (FileKinds.IsComponentImport(codeDocument.GetFileKind()) || directive.Node.IsImported())
            {
                directive.Node.Diagnostics.Add(ComponentDiagnosticFactory.CreatePageDirective_CannotBeImported(directive.Node.Source.Value));
            }
        }

        // Insert the attributes 'on-top' of the class declaration, since classes don't directly support attributes.
        var index = 0;

        for (; index < @namespace.Children.Count; index++)
        {
            if (object.ReferenceEquals(@class, @namespace.Children[index]))
            {
                break;
            }
        }

        for (var i = 0; i < directives.Count; i++)
        {
            var pageDirective = (DirectiveIntermediateNode)directives[i].Node;

            // The parser also adds errors for invalid syntax, we just need to not crash.
            var routeToken = pageDirective.Tokens.FirstOrDefault();

            if (routeToken != null &&
                routeToken.Content.Length >= 3 &&
                routeToken.Content[0] == '\"' &&
                routeToken.Content[1] == '/' &&
                routeToken.Content[routeToken.Content.Length - 1] == '\"')
            {
                var template = new StringSegment(routeToken.Content, 1, routeToken.Content.Length - 2);
                @namespace.Children.Insert(index++, new RouteAttributeExtensionNode(template));
            }
            else
            {
                pageDirective.Diagnostics.Add(ComponentDiagnosticFactory.CreatePageDirective_MustSpecifyRoute(pageDirective.Source));
            }
        }
    }
示例#57
0
        private static bool ComponentNamespaceMatchesFullyQualifiedName(RazorCodeDocument razorCodeDocument, StringSegment namespaceName)
        {
            var namespaceNode = (NamespaceDeclarationIntermediateNode)razorCodeDocument
                                .GetDocumentIntermediateNode()
                                .FindDescendantNodes <IntermediateNode>()
                                .First(n => n is NamespaceDeclarationIntermediateNode);

            return(new StringSegment(namespaceNode.Content).Equals(namespaceName, StringComparison.Ordinal));
        }
示例#58
0
        public StringWithQualityHeaderValue(StringSegment value)
        {
            HeaderUtilities.CheckValidToken(value, nameof(value));

            _value = value;
        }
示例#59
0
        public static bool TryParse(StringSegment input, out RangeHeaderValue parsedValue)
        {
            var index = 0;

            return(Parser.TryParseValue(input, ref index, out parsedValue));
        }
示例#60
0
 public static string Highlight(this StringSegment segment, string startHighlight = "[", string endHighlight = "]")
 {
     return(segment.SourceString
            .Insert(segment.End, endHighlight)
            .Insert(segment.Start, startHighlight));
 }