private static bool AddRange(HttpRangeSpecifier specifier, long rangeStart, long rangeEnd) { try { specifier.RangeCollection.Add(new HttpRange(rangeStart, rangeEnd)); } catch (ArgumentOutOfRangeException) { return(false); } return(true); }
public static HttpRangeSpecifier Parse(string value) { if (string.IsNullOrEmpty(value)) { throw new ArgumentNullException("value"); } HttpRangeSpecifier httpRangeSpecifier = new HttpRangeSpecifier(); string message; if (!HttpRangeSpecifier.TryParseInternal(value, httpRangeSpecifier, out message)) { throw new ArgumentException(message); } return(httpRangeSpecifier); }
private static bool ProcessRangeEnd(HttpRangeSpecifier specifier, ref string parseFailureReason, HttpRangeSpecifier.StrSegment currentSegment, long rangeStart) { long rangeEnd = -1L; if (currentSegment.Start >= 0 && currentSegment.Length > 0 && !long.TryParse(currentSegment.ToString(), NumberStyles.Integer, CultureInfo.InvariantCulture, out rangeEnd)) { parseFailureReason = "Could not parse last-byte-pos at " + currentSegment.Start; return(false); } if (!HttpRangeSpecifier.AddRange(specifier, rangeStart, rangeEnd)) { parseFailureReason = "Invalid range specification near " + currentSegment.Start; return(false); } return(true); }
public static void SetRange(HttpWebRequest destination, string value) { HttpRangeSpecifier httpRangeSpecifier = HttpRangeSpecifier.Parse(value); foreach (HttpRange httpRange in httpRangeSpecifier.RangeCollection) { if (httpRange.HasFirstBytePosition && httpRange.HasLastBytePosition) { destination.AddRange(httpRangeSpecifier.RangeUnitSpecifier, httpRange.FirstBytePosition, httpRange.LastBytePosition); } else if (httpRange.HasFirstBytePosition) { destination.AddRange(httpRangeSpecifier.RangeUnitSpecifier, httpRange.FirstBytePosition); } else if (httpRange.HasSuffixLength) { destination.AddRange(httpRangeSpecifier.RangeUnitSpecifier, -httpRange.SuffixLength); } } }
private static bool TryParseInternal(string value, HttpRangeSpecifier specifier, out string parseFailureReason) { if (specifier == null) { throw new ArgumentNullException("specifier"); } HttpRangeSpecifier.StrSegment strSegment = new HttpRangeSpecifier.StrSegment(value); HttpRangeSpecifier.ParseState parseState = HttpRangeSpecifier.ParseState.Start; parseFailureReason = string.Empty; int i = 0; int length = value.Length; long rangeStart = -1L; while (i < length) { char c = value[i]; switch (parseState) { case HttpRangeSpecifier.ParseState.Start: if (c != ' ' && c != '\t') { if (strSegment.Start == -1) { strSegment.Start = i; } if (c == '=') { strSegment.SetLengthFromTerminatingIndex(i); strSegment.Trim(); specifier.RangeUnitSpecifier = strSegment.ToString(); parseState = HttpRangeSpecifier.ParseState.RangeStart; rangeStart = -1L; strSegment.Reset(); } } break; case HttpRangeSpecifier.ParseState.RangeStart: if (c != ' ' && c != '\t') { if (strSegment.Start == -1) { strSegment.Start = i; } if (c == '-' || c == ',') { strSegment.SetLengthFromTerminatingIndex(i); strSegment.Trim(); if (c != '-') { parseFailureReason = "Invalid range, missing '-' character at " + (strSegment.Start + strSegment.Length); return(false); } if (strSegment.Length > 0 && !long.TryParse(strSegment.ToString(), NumberStyles.Integer, CultureInfo.InvariantCulture, out rangeStart)) { parseFailureReason = "Could not parse first-byte-pos at " + strSegment.Start; return(false); } parseState = HttpRangeSpecifier.ParseState.RangeEnd; strSegment.Reset(); } } break; case HttpRangeSpecifier.ParseState.RangeEnd: if (c != ' ' && c != '\t') { if (strSegment.Start == -1) { strSegment.Start = i; } if (c == ',') { strSegment.SetLengthFromTerminatingIndex(i); strSegment.Trim(); if (!HttpRangeSpecifier.ProcessRangeEnd(specifier, ref parseFailureReason, strSegment, rangeStart)) { return(false); } rangeStart = -1L; parseState = HttpRangeSpecifier.ParseState.RangeStart; strSegment.Reset(); } } break; } i++; } if (strSegment.Start != -1) { strSegment.SetLengthFromTerminatingIndex(i); strSegment.Trim(); if (parseState == HttpRangeSpecifier.ParseState.Start) { specifier.RangeUnitSpecifier = strSegment.ToString(); } if (parseState == HttpRangeSpecifier.ParseState.RangeStart) { parseFailureReason = "Invalid range, missing '-' character at " + (strSegment.Start + strSegment.Length); return(false); } } else { if (parseState == HttpRangeSpecifier.ParseState.Start) { parseFailureReason = "Did not find range unit specifier"; return(false); } if (parseState == HttpRangeSpecifier.ParseState.RangeStart) { parseFailureReason = "Expected range value at the end."; return(false); } } if (parseState == HttpRangeSpecifier.ParseState.RangeEnd && !HttpRangeSpecifier.ProcessRangeEnd(specifier, ref parseFailureReason, strSegment, rangeStart)) { return(false); } if (specifier.RangeCollection.Count == 0) { parseFailureReason = "No ranges found."; return(false); } return(true); }