Allow GetTexture calls with no second value in the range header (e.g. just 5333-)

It looks like the latest Kokua is doing this.
As per http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html, leaving off the second value is legal
This indicates the caller wants the rest of the entity.
0.7.4-extended
Justin Clark-Casey (justincc) 2012-12-06 01:12:12 +00:00
parent b52ac8c5d1
commit 13e29ae3f7
1 changed files with 34 additions and 1 deletions

View File

@ -246,6 +246,11 @@ namespace OpenSim.Capabilities.Handlers
} }
else else
{ {
// Handle the case where no second range value was given. This is equivalent to requesting
// the rest of the entity.
if (end == -1)
end = int.MaxValue;
end = Utils.Clamp(end, 0, texture.Data.Length - 1); end = Utils.Clamp(end, 0, texture.Data.Length - 1);
start = Utils.Clamp(start, 0, end); start = Utils.Clamp(start, 0, end);
int len = end - start + 1; int len = end - start + 1;
@ -299,16 +304,44 @@ namespace OpenSim.Capabilities.Handlers
// texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length); // texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length);
} }
/// <summary>
/// Parse a range header.
/// </summary>
/// <remarks>
/// As per http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html,
/// this obeys range headers with two values (e.g. 533-4165) and no second value (e.g. 533-).
/// Where there is no value, -1 is returned.
/// FIXME: Need to cover the case where only a second value is specified (e.g. -4165), probably by returning -1
/// for start.</remarks>
/// <returns></returns>
/// <param name='header'></param>
/// <param name='start'>Undefined if the parse fails.</param>
/// <param name='end'>Undefined if the parse fails.</param>
private bool TryParseRange(string header, out int start, out int end) private bool TryParseRange(string header, out int start, out int end)
{ {
start = end = 0;
if (header.StartsWith("bytes=")) if (header.StartsWith("bytes="))
{ {
string[] rangeValues = header.Substring(6).Split('-'); string[] rangeValues = header.Substring(6).Split('-');
if (rangeValues.Length == 2) if (rangeValues.Length == 2)
{ {
if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end)) if (!Int32.TryParse(rangeValues[0], out start))
return false;
string rawEnd = rangeValues[1];
if (rawEnd == "")
{
end = -1;
return true; return true;
} }
else if (Int32.TryParse(rawEnd, out end))
{
return true;
}
}
} }
start = end = 0; start = end = 0;