-
|
I'm trying to replace my old custom IResourceHandler with a custom ResourceHandler, following https://github.com/cefsharp/CefSharp/wiki/General-Usage#resourcehandler public class CustomResourceHandler : ResourceHandler
{
private readonly string _filePath;
private readonly string _mimeType;
private readonly bool isRangeRequest;
private readonly int rangeFrom;
private readonly int rangeTo;
public CustomResourceHandler(string filePath, string mimeType, string rangeHeader)
{
_filePath = filePath;
_mimeType = mimeType;
if (rangeHeader != null) {
isRangeRequest = true;
if (rangeHeader.Contains(',')) {
throw new NotImplementedException();
}
var range = rangeHeader.Substring(6).Split('-');
rangeFrom = range[0] == "" ? -1 : int.Parse(range[0]);
rangeTo = range[1] == "" ? -1 : int.Parse(range[1]);
}
}
public override CefReturnValue ProcessRequestAsync(IRequest request, ICallback callback)
{
Task.Run(() =>
{
using (callback) {
if (isRangeRequest) {
StatusCode = 206;
using (FileStream fileStream = new FileStream(_filePath, FileMode.Open, FileAccess.Read)) {
if (rangeFrom == -1) {
throw new NotImplementedException();
}
fileStream.Position = rangeFrom;
if (rangeTo == -1) {
Headers.Set("Content-Range", $"bytes {rangeFrom}-{fileStream.Length - 1}/{fileStream.Length}");
ResponseLength = fileStream.Length;
Stream = new MemoryStream((int)ResponseLength);
fileStream.CopyTo(Stream);
} else {
Headers.Set("Content-Range", $"bytes {rangeFrom}-{rangeTo}/{fileStream.Length}");
int rangeLength = rangeTo + 1 - rangeFrom;
ResponseLength = rangeLength;
byte[] responseBytes = new byte[rangeLength];
fileStream.Read(responseBytes, 0, rangeLength);
Stream = new MemoryStream(responseBytes);
}
Stream.Position = 0;
}
} else {
StatusCode = 200;
Stream = File.OpenRead(_filePath);
}
MimeType = _mimeType;
//Headers.Set("Cache-Control", "no-store"); // <- Breaks Response
callback.Continue();
}
});
return CefReturnValue.ContinueAsync;
}
}I'm using it in a ResourceRequestHandler like this: protected override IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
localCacheExists = File.Exists(localFile);
if (!File.Exists(localFile)) {
return null;
}
var mimeType = Cef.GetMimeType(localFileExtension);
return new CustomResourceHandler(localFile, mimeType, request.Headers["Range"]);
}The headers are received correctly, but the request stucks in the "pending" state in chromium devtools. My old IResourceHandler implementation (with Open / GetResponseHeaders / Read / Cancel / Dispose) works though. What am I missing? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
|
Appraently setting header |
Beta Was this translation helpful? Give feedback.
Appraently setting header
Cache-Control: no-storebreaks things. In my old implementation I didn't add this header... so much time wasted on debugging this.