/// <summary> /// Tries to parse the <c>Coded-URL</c> from a <see cref="StringSource"/> /// </summary> /// <param name="source">The <see cref="StringSource"/> to parse the <c>Coded-URL</c> from</param> /// <param name="codedUrl">The parsed <c>Coded-URL</c></param> /// <returns><see langword="true"/> when the <c>Coded-URL</c> could be parsed successfully</returns> internal static bool TryParse([NotNull] StringSource source, out Uri codedUrl) { if (!source.AdvanceIf("<")) { codedUrl = null; return(false); } // Coded-URL found var codedUrlText = source.GetUntil('>'); if (codedUrlText == null) { throw new ArgumentException($"{source.Remaining} is not a valid Coded-URL (not ending with '>')", nameof(source)); } source.Advance(1); codedUrl = new Uri(codedUrlText, UriKind.RelativeOrAbsolute); return(true); }
internal static IEnumerable <EntityTag> Parse(StringSource source) { while (!source.SkipWhiteSpace()) { bool isWeak; if (source.AdvanceIf("W/\"", StringComparison.OrdinalIgnoreCase)) { isWeak = true; } else if (!source.AdvanceIf("\"")) { break; } else { isWeak = false; } var etagText = source.GetUntil('"'); if (etagText == null) { throw new ArgumentException($"{source.Remaining} is not a valid ETag", nameof(source)); } yield return(new EntityTag(isWeak, etagText)); if (source.Advance(1).SkipWhiteSpace()) { break; } if (!source.AdvanceIf(",")) { break; } } }