Skip to content

Commit 7dd065e

Browse files
committed
Merge pull request #610 from amaitland/feature/respond-with
Feature - GetResourceHandler
2 parents 1262b76 + 757bc66 commit 7dd065e

16 files changed

+168
-211
lines changed

CefSharp.Core/CefSharp.Core.vcxproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@
223223
<ClCompile Include="Internals\CookieVisitor.cpp" />
224224
<ClCompile Include="Internals\CefRequestWrapper.cpp" />
225225
<ClCompile Include="Internals\DownloadAdapter.cpp" />
226-
<ClCompile Include="Internals\RequestResponse.cpp" />
227226
<ClCompile Include="Internals\StringVisitor.cpp" />
228227
<ClCompile Include="SchemeHandlerResponse.cpp" />
229228
<ClCompile Include="SchemeHandlerWrapper.cpp" />
@@ -251,7 +250,6 @@
251250
<ClInclude Include="Internals\StringVisitor.h" />
252251
<ClInclude Include="MouseButtonType.h" />
253252
<ClInclude Include="ManagedCefBrowserAdapter.h" />
254-
<ClInclude Include="Internals\RequestResponse.h" />
255253
<ClInclude Include="CefSettings.h" />
256254
<ClInclude Include="SchemeHandlerResponse.h" />
257255
<ClInclude Include="SchemeHandlerWrapper.h" />

CefSharp.Core/CefSharp.Core.vcxproj.filters

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@
4141
<ClCompile Include="Internals\CefWebPluginInfoWrapper.cpp">
4242
<Filter>Source Files</Filter>
4343
</ClCompile>
44-
<ClCompile Include="Internals\RequestResponse.cpp">
45-
<Filter>Source Files</Filter>
46-
</ClCompile>
4744
<ClCompile Include="Internals\StringVisitor.cpp">
4845
<Filter>Source Files</Filter>
4946
</ClCompile>
@@ -112,9 +109,6 @@
112109
<ClInclude Include="Internals\CefWebPluginInfoWrapper.h">
113110
<Filter>Header Files</Filter>
114111
</ClInclude>
115-
<ClInclude Include="Internals\RequestResponse.h">
116-
<Filter>Header Files</Filter>
117-
</ClInclude>
118112
<ClInclude Include="Internals\StringVisitor.h">
119113
<Filter>Header Files</Filter>
120114
</ClInclude>

CefSharp.Core/Internals/ClientAdapter.cpp

Lines changed: 47 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
#include "Internals/CefRequestWrapper.h"
88
#include "Internals/CefWebPluginInfoWrapper.h"
99
#include "Internals/JavascriptBinding/BindingHandler.h"
10-
#include "Internals/RequestResponse.h"
1110
#include "ClientAdapter.h"
1211
#include "Cef.h"
1312
#include "DownloadAdapter.h"
1413
#include "StreamAdapter.h"
14+
#include "include/wrapper/cef_stream_resource_handler.h"
1515

1616
using namespace std;
17+
using namespace CefSharp;
1718
using namespace CefSharp::Internals::JavascriptBinding;
1819

1920
namespace CefSharp
@@ -193,7 +194,7 @@ namespace CefSharp
193194
_browserControl->OnLoadError(StringUtils::ToClr(failedUrl), (CefErrorCode)errorCode, StringUtils::ToClr(errorText));
194195
}
195196

196-
bool ClientAdapter:: OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool isRedirect)
197+
bool ClientAdapter::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool isRedirect)
197198
{
198199
IRequestHandler^ handler = _browserControl->RequestHandler;
199200
if (handler == nullptr)
@@ -243,46 +244,65 @@ namespace CefSharp
243244
}
244245
}
245246

246-
bool ClientAdapter::OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request)
247+
// Called on the IO thread before a resource is loaded. To allow the resource
248+
// to load normally return NULL. To specify a handler for the resource return
249+
// a CefResourceHandler object. The |request| object should not be modified in
250+
// this callback.
251+
CefRefPtr<CefResourceHandler> ClientAdapter::GetResourceHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request)
247252
{
248-
// TOOD: Try to support with CEF3; seems quite difficult because the method signature has changed greatly with many parts
249-
// seemingly MIA...
250253
IRequestHandler^ handler = _browserControl->RequestHandler;
251254

252255
if (handler == nullptr)
253256
{
254-
return false;
257+
return NULL;
255258
}
256259

257-
CefRequestWrapper^ wrapper = gcnew CefRequestWrapper(request);
258-
RequestResponse^ requestResponse = gcnew RequestResponse(wrapper);
260+
auto requestWrapper = gcnew CefRequestWrapper(request);
259261

260-
bool ret = handler->OnBeforeResourceLoad(_browserControl, requestResponse);
262+
auto resourceHandler = handler->GetResourceHandler(_browserControl, requestWrapper);
261263

262-
if (requestResponse->Action == ResponseAction::Redirect)
264+
if(resourceHandler != nullptr)
263265
{
264-
request->SetURL(StringUtils::ToNative(requestResponse->RedirectUrl));
266+
auto mimeType = StringUtils::ToNative(resourceHandler->MimeType);
267+
auto statusText = StringUtils::ToNative(resourceHandler->StatusText);
268+
269+
CefRefPtr<StreamAdapter> streamAdapter = new StreamAdapter(resourceHandler->Stream);
270+
271+
CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForHandler(static_cast<CefRefPtr<CefReadHandler>>(streamAdapter));
272+
if (stream.get())
273+
{
274+
CefResponse::HeaderMap map = SchemeHandlerWrapper::ToHeaderMap(resourceHandler->Headers);
275+
276+
//TODO: Investigate crash when using full response
277+
//return new CefStreamResourceHandler(resourceHandler->StatusCode, statusText, mimeType, map, stream);
278+
return new CefStreamResourceHandler(mimeType, stream);
279+
}
265280
}
266-
else if (requestResponse->Action == ResponseAction::Respond)
267-
{
268-
throw gcnew NotImplementedException("Respond is not yet supported.");
269281

270-
//resourceStream = CefStreamReader::CreateForHandler(static_cast<CefRefPtr<CefReadHandler>>(adapter));
271-
//response->SetMimeType(StringUtils::ToNative(requestResponse->MimeType));
272-
//response->SetStatus(requestResponse->StatusCode);
273-
//response->SetStatusText(StringUtils::ToNative(requestResponse->StatusText));
282+
return NULL;
283+
}
284+
285+
bool ClientAdapter::OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request)
286+
{
287+
IRequestHandler^ handler = _browserControl->RequestHandler;
288+
289+
if (handler == nullptr)
290+
{
291+
return false;
292+
}
274293

275-
//CefResponse::HeaderMap map;
294+
auto requestWrapper = gcnew CefRequestWrapper(request);
295+
auto response = gcnew Response();
276296

277-
//if (requestResponse->ResponseHeaders != nullptr)
278-
//{
279-
// for each (KeyValuePair<String^, String^>^ kvp in requestResponse->ResponseHeaders)
280-
// {
281-
// map.insert(pair<CefString,CefString>(StringUtils::ToNative(kvp->Key),StringUtils::ToNative(kvp->Value)));
282-
// }
283-
//}
297+
bool ret = handler->OnBeforeResourceLoad(_browserControl, requestWrapper, response);
284298

285-
//response->SetHeaderMap(map);
299+
if (response->Action == ResponseAction::Redirect)
300+
{
301+
request->SetURL(StringUtils::ToNative(response->RedirectUrl));
302+
}
303+
else if (response->Action == ResponseAction::Cancel)
304+
{
305+
return true;
286306
}
287307

288308
return ret;
@@ -339,42 +359,6 @@ namespace CefSharp
339359
return handled;
340360
}
341361

342-
// TODO: Investigate how we can support in CEF3.
343-
/*
344-
void ClientAdapter::OnResourceResponse(CefRefPtr<CefBrowser> browser, const CefString& url, CefRefPtr<CefResponse> response, CefRefPtr<CefContentFilter>& filter)
345-
{
346-
IRequestHandler^ handler = _browserControl->RequestHandler;
347-
if (handler == nullptr)
348-
{
349-
return;
350-
}
351-
352-
WebHeaderCollection^ headers = gcnew WebHeaderCollection();
353-
CefResponse::HeaderMap map;
354-
response->GetHeaderMap(map);
355-
for (CefResponse::HeaderMap::iterator it = map.begin(); it != map.end(); ++it)
356-
{
357-
try
358-
{
359-
headers->Add(StringUtils::ToClr(it->first), StringUtils::ToClr(it->second));
360-
}
361-
catch (Exception ^ex)
362-
{
363-
// adding a header with invalid characters can cause an exception to be
364-
// thrown. we will drop those headers for now.
365-
// we could eventually use reflection to call headers->AddWithoutValidate().
366-
}
367-
}
368-
369-
handler->OnResourceResponse(
370-
_browserControl,
371-
StringUtils::ToClr(url),
372-
response->GetStatus(),
373-
StringUtils::ToClr(response->GetStatusText()),
374-
StringUtils::ToClr(response->GetMimeType()),
375-
headers);
376-
}*/
377-
378362
void ClientAdapter::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
379363
CefRefPtr<CefContextMenuParams> params, CefRefPtr<CefMenuModel> model)
380364
{

CefSharp.Core/Internals/ClientAdapter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ namespace CefSharp
8282
virtual DECL void OnLoadError(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, ErrorCode errorCode, const CefString& errorText, const CefString& failedUrl) OVERRIDE;
8383

8484
// CefRequestHandler
85+
virtual DECL CefRefPtr<CefResourceHandler> GetResourceHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) OVERRIDE;
8586
virtual DECL bool OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) OVERRIDE;
8687
virtual DECL bool GetAuthCredentials(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, bool isProxy,
8788
const CefString& host, int port, const CefString& realm, const CefString& scheme, CefRefPtr<CefAuthCallback> callback) OVERRIDE;

CefSharp.Core/Internals/RequestResponse.cpp

Lines changed: 0 additions & 49 deletions
This file was deleted.

CefSharp.Core/Internals/RequestResponse.h

Lines changed: 0 additions & 59 deletions
This file was deleted.

CefSharp.Core/Internals/StreamAdapter.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ namespace CefSharp
1212
StreamAdapter::~StreamAdapter()
1313
{
1414
_stream->Close();
15+
_stream = nullptr;
1516
}
1617

1718
size_t StreamAdapter::Read(void* ptr, size_t size, size_t n)
1819
{
1920
AutoLock lock_scope(_syncRoot);
2021

21-
try {
22+
try
23+
{
2224
array<Byte>^ buffer = gcnew array<Byte>(n * size);
2325
int ret = _stream->Read(buffer, 0, n);
2426
pin_ptr<Byte> src = &buffer[0];
@@ -33,17 +35,18 @@ namespace CefSharp
3335

3436
int StreamAdapter::Seek(int64 offset, int whence)
3537
{
36-
SeekOrigin seekOrigin;
38+
System::IO::SeekOrigin seekOrigin;
39+
3740
switch (whence)
3841
{
3942
case SEEK_CUR:
40-
seekOrigin = SeekOrigin::Current;
43+
seekOrigin = System::IO::SeekOrigin::Current;
4144
break;
4245
case SEEK_END:
43-
seekOrigin = SeekOrigin::End;
46+
seekOrigin = System::IO::SeekOrigin::End;
4447
break;
4548
case SEEK_SET:
46-
seekOrigin = SeekOrigin::Begin;
49+
seekOrigin = System::IO::SeekOrigin::Begin;
4750
break;
4851
default:
4952
return -1;
@@ -70,5 +73,10 @@ namespace CefSharp
7073
{
7174
return _stream->Length == _stream->Position;
7275
}
76+
77+
bool StreamAdapter::MayBlock()
78+
{
79+
return true;
80+
}
7381
}
7482
}

CefSharp.Core/Internals/StreamAdapter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ namespace CefSharp
2626
virtual int Seek(int64 offset, int whence);
2727
virtual int64 Tell();
2828
virtual int Eof();
29+
virtual bool MayBlock();
2930

3031
IMPLEMENT_REFCOUNTING(StreamAdapter);
3132
};

CefSharp.Core/SchemeHandlerWrapper.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ namespace CefSharp
2929
int _contentLength;
3030
bool _closeStream;
3131
int SizeFromStream();
32-
CefResponse::HeaderMap ToHeaderMap(NameValueCollection^ headers);
33-
3432
public:
3533

3634
SchemeHandlerWrapper(ISchemeHandler^ handler) : _handler(handler)
@@ -47,6 +45,8 @@ namespace CefSharp
4745
virtual bool ReadResponse(void* data_out, int bytes_to_read, int& bytes_read, CefRefPtr<CefCallback> callback);
4846
virtual void Cancel();
4947

48+
static CefResponse::HeaderMap ToHeaderMap(NameValueCollection^ headers);
49+
5050
IMPLEMENT_REFCOUNTING(SchemeHandlerWrapper);
5151
};
5252

0 commit comments

Comments
 (0)