зеркало из https://github.com/electron/electron.git
feat: Support response headers in File protocol handler (#16098)
* feat: Support response headers in File protocol handler * bugfix: Null check headers value & fix tests * refactor: Use non-deprecated FindKeyOfType
This commit is contained in:
Родитель
03f876470e
Коммит
cc85946f55
|
@ -71,14 +71,27 @@ void URLRequestAsyncAsarJob::StartAsync(std::unique_ptr<base::Value> options,
|
|||
}
|
||||
|
||||
std::string file_path;
|
||||
response_headers_ = new net::HttpResponseHeaders("HTTP/1.1 200 OK");
|
||||
if (options->is_dict()) {
|
||||
auto* path_value =
|
||||
options->FindKeyOfType("path", base::Value::Type::STRING);
|
||||
if (path_value)
|
||||
file_path = path_value->GetString();
|
||||
base::DictionaryValue* dict =
|
||||
static_cast<base::DictionaryValue*>(options.get());
|
||||
base::Value* pathValue =
|
||||
dict->FindKeyOfType("path", base::Value::Type::STRING);
|
||||
if (pathValue) {
|
||||
file_path = pathValue->GetString();
|
||||
}
|
||||
base::Value* headersValue =
|
||||
dict->FindKeyOfType("headers", base::Value::Type::DICTIONARY);
|
||||
if (headersValue) {
|
||||
for (const auto& iter : headersValue->DictItems()) {
|
||||
response_headers_->AddHeader(iter.first + ": " +
|
||||
iter.second.GetString());
|
||||
}
|
||||
}
|
||||
} else if (options->is_string()) {
|
||||
file_path = options->GetString();
|
||||
}
|
||||
response_headers_->AddHeader(kCORSHeader);
|
||||
|
||||
if (file_path.empty()) {
|
||||
NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
|
||||
|
@ -103,11 +116,7 @@ void URLRequestAsyncAsarJob::Kill() {
|
|||
}
|
||||
|
||||
void URLRequestAsyncAsarJob::GetResponseInfo(net::HttpResponseInfo* info) {
|
||||
std::string status("HTTP/1.1 200 OK");
|
||||
auto* headers = new net::HttpResponseHeaders(status);
|
||||
|
||||
headers->AddHeader(kCORSHeader);
|
||||
info->headers = headers;
|
||||
info->headers = response_headers_;
|
||||
}
|
||||
|
||||
} // namespace atom
|
||||
|
|
|
@ -26,6 +26,7 @@ class URLRequestAsyncAsarJob : public asar::URLRequestAsarJob, public JsAsker {
|
|||
void Kill() override;
|
||||
|
||||
private:
|
||||
scoped_refptr<net::HttpResponseHeaders> response_headers_;
|
||||
base::WeakPtrFactory<URLRequestAsyncAsarJob> weak_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(URLRequestAsyncAsarJob);
|
||||
|
|
|
@ -99,7 +99,9 @@ going to be created with `scheme`. `completion` will be called with
|
|||
|
||||
To handle the `request`, the `callback` should be called with either the file's
|
||||
path or an object that has a `path` property, e.g. `callback(filePath)` or
|
||||
`callback({ path: filePath })`.
|
||||
`callback({ path: filePath })`. The object may also have a `headers` property
|
||||
which gives a list of strings for the response headers, e.g.
|
||||
`callback({ path: filePath, headers: ["Content-Security-Policy: default-src 'none'"]})`.
|
||||
|
||||
When `callback` is called with nothing, a number, or an object that has an
|
||||
`error` property, the `request` will fail with the `error` number you
|
||||
|
|
|
@ -320,6 +320,28 @@ describe('protocol module', () => {
|
|||
})
|
||||
})
|
||||
|
||||
it('sets custom headers', (done) => {
|
||||
const handler = (request, callback) => callback({
|
||||
path: filePath,
|
||||
headers: { 'X-Great-Header': 'sogreat' }
|
||||
})
|
||||
protocol.registerFileProtocol(protocolName, handler, (error) => {
|
||||
if (error) return done(error)
|
||||
$.ajax({
|
||||
url: protocolName + '://fake-host',
|
||||
cache: false,
|
||||
success: (data, status, request) => {
|
||||
assert.strictEqual(data, String(fileContent))
|
||||
assert.strictEqual(request.getResponseHeader('X-Great-Header'), 'sogreat')
|
||||
done()
|
||||
},
|
||||
error: (xhr, errorType, error) => {
|
||||
done(error)
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
it('sends object as response', (done) => {
|
||||
const handler = (request, callback) => callback({ path: filePath })
|
||||
protocol.registerFileProtocol(protocolName, handler, (error) => {
|
||||
|
|
Загрузка…
Ссылка в новой задаче