Skip to content

Commit cba73b8

Browse files
committed
Update Partials 216
1 parent c23a571 commit cba73b8

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

Unosquare.Labs.EmbedIO.Tests/StaticFilesModuleTest.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ public void GetEtag()
7070
var response = (HttpWebResponse)ex.Response;
7171

7272
Assert.AreEqual(response.StatusCode, HttpStatusCode.NotModified, "Status Code NotModified");
73+
return;
7374
}
75+
76+
Assert.Fail("The Exception should raise");
7477
}
7578

7679
[Test]
@@ -120,6 +123,29 @@ public void GetMiddlePartial()
120123
}
121124
}
122125

126+
[Test]
127+
public void GetLastPart()
128+
{
129+
const int maxLength = 100;
130+
var request = (HttpWebRequest)WebRequest.Create(Resources.ServerAddress + "/" + TestHelper.BigDataFile);
131+
request.AddRange(-maxLength);
132+
133+
using (var response = (HttpWebResponse)request.GetResponse())
134+
{
135+
Assert.AreEqual(response.StatusCode, HttpStatusCode.PartialContent, "Status Code PartialCode");
136+
137+
var ms = new MemoryStream();
138+
response.GetResponseStream().CopyTo(ms);
139+
var data = ms.ToArray();
140+
141+
Assert.IsNotNull(data, "Data is not empty");
142+
var subset = new byte[maxLength];
143+
var originalSet = TestHelper.GetBigData();
144+
Buffer.BlockCopy(originalSet, originalSet.Length - maxLength, subset, 0, maxLength);
145+
Assert.AreEqual(subset, data);
146+
}
147+
}
148+
123149
[Test]
124150
public void GetEntireFileWithChunks()
125151
{
@@ -154,6 +180,39 @@ public void GetEntireFileWithChunks()
154180
Assert.AreEqual(originalSet, buffer);
155181
}
156182

183+
[Test]
184+
public void GetInvalidChunk()
185+
{
186+
var originalSet = TestHelper.GetBigData();
187+
var requestHead = (HttpWebRequest)WebRequest.Create(Resources.ServerAddress + "/" + TestHelper.BigDataFile);
188+
requestHead.Method = "HEAD";
189+
190+
var remoteSize = ((HttpWebResponse)requestHead.GetResponse()).ContentLength;
191+
Assert.AreEqual(remoteSize, originalSet.Length);
192+
193+
var request = (HttpWebRequest)WebRequest.Create(Resources.ServerAddress + "/" + TestHelper.BigDataFile);
194+
request.AddRange(0, remoteSize + 10);
195+
196+
try
197+
{
198+
request.GetResponse();
199+
}
200+
catch (WebException ex)
201+
{
202+
if (ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
203+
throw;
204+
205+
var response = (HttpWebResponse)ex.Response;
206+
207+
Assert.AreEqual(response.StatusCode, HttpStatusCode.RequestedRangeNotSatisfiable, "Status Code RequestedRangeNotSatisfiable");
208+
Assert.AreEqual(response.Headers["Content-Range"],
209+
string.Format("bytes */{0}", remoteSize));
210+
return;
211+
}
212+
213+
Assert.Fail("The Exception should raise");
214+
}
215+
157216
[Test]
158217
public void GetNotPartial()
159218
{

Unosquare.Labs.EmbedIO/Modules/StaticFilesModule.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ private bool HandleGet(HttpListenerContext context, WebServer server, bool sendB
260260
if (range.Length == 2 && int.TryParse(range[0], out lrange) &&
261261
int.TryParse(range[1], out urange))
262262
{
263-
urange = urange > fileSize ? (int) fileSize : urange;
264263
isPartial = true;
265264
}
266265

@@ -271,10 +270,26 @@ private bool HandleGet(HttpListenerContext context, WebServer server, bool sendB
271270
urange = (int) fileSize - 1;
272271
isPartial = true;
273272
}
273+
274+
if (range.Length == 2 && string.IsNullOrWhiteSpace(range[0]) &&
275+
int.TryParse(range[1], out urange))
276+
{
277+
lrange = (int) fileSize - urange;
278+
urange = (int)fileSize - 1;
279+
isPartial = true;
280+
}
274281
}
275282

276283
if (isPartial)
277284
{
285+
if (urange > fileSize)
286+
{
287+
context.Response.StatusCode = 416;
288+
context.Response.AddHeader(Constants.HeaderContentRanges,
289+
string.Format("bytes */{0}", fileSize));
290+
return true;
291+
}
292+
278293
size = (urange - lrange) + 1;
279294

280295
context.Response.AddHeader(Constants.HeaderContentRanges,

0 commit comments

Comments
 (0)