I try to let CEF application load local html file using custom resource handler.
When load local document with CefResourceHandler and custom headerMap, CEF does not change it's default charset to custom charset.
But when load remote document, CEF does change it's charset to http header's charset.
Does anybody knows why this happened?
Below is my implementations.
(My CEF version is 2171 build, but same problem occurred at master branch)
- Code: Select all
CefRefPtr<CefResourceHandler> MyHandler::GetResourceHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request) {
CEF_REQUIRE_UI_THREAD();
if (frame->IsMain() && request->GetURL().ToString() == request_url_) {
return new MyResourceHandler(request_content_type_, request_mime_, _html, _htmlsize);
}
}
myhandler.cpp
- Code: Select all
class MyResourceHandler : public CefResourceHandler {
public:
MyResourceHandler(std::string& content_type, std::string& mime_type, char* response_data, int response_size)
: content_type_(content_type),
mime_type_(mime_type),
response_data_(response_data),
response_size_(response_size),
offset_(0)
{
}
bool ProcessRequest(CefRefPtr<CefRequest> request, CefRefPtr<CefCallback> callback) OVERRIDE {
CefRequest::HeaderMap headerMap;
request->GetHeaderMap(headerMap);
headerMap.erase("Accept-Charset");
headerMap.insert(std::make_pair("Accept-Charset", "UTF-8"));
request->SetHeaderMap(headerMap);
callback->Continue();
return true;
}
void GetResponseHeaders(CefRefPtr<CefResponse> response, int64& response_length, CefString& redirectUrl) OVERRIDE {
response->SetStatus(200);
response->SetStatusText("OK");
response->SetMimeType(mime_type_);
CefResponse::HeaderMap headerMap;
response->GetHeaderMap(headerMap);
headerMap.erase("Content-Type");
headerMap.insert(std::make_pair("Content-Type", content_type_)); // this headermap setting is ignored by browser. why???
response->SetHeaderMap(headerMap);
response_length = response_size_;
}
bool ReadResponse(void* response_data_out, int bytes_to_read, int& bytes_read, CefRefPtr<CefCallback> callback) OVERRIDE {
bool has_data = false;
size_t size = static_cast<size_t>(response_size_);
if (offset_ < size) {
int t_size = std::min(bytes_to_read, static_cast<int>(size - offset_));
memcpy(response_data_out, response_data_ + offset_, t_size);
offset_ += t_size;
bytes_read = t_size;
has_data = true;
}
return has_data;
}
void Cancel() OVERRIDE {
}
private:
std::string content_type_;
std::string mime_type_;
char* response_data_;
int response_size_;
size_t offset_;
IMPLEMENT_REFCOUNTING(MyResourceHandler);
};
myresourcehandler.cpp
Plz excuse my poor english.