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:
parent
03f876470e
commit
cc85946f55
4 changed files with 44 additions and 10 deletions
|
@ -71,14 +71,27 @@ void URLRequestAsyncAsarJob::StartAsync(std::unique_ptr<base::Value> options,
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string file_path;
|
std::string file_path;
|
||||||
|
response_headers_ = new net::HttpResponseHeaders("HTTP/1.1 200 OK");
|
||||||
if (options->is_dict()) {
|
if (options->is_dict()) {
|
||||||
auto* path_value =
|
base::DictionaryValue* dict =
|
||||||
options->FindKeyOfType("path", base::Value::Type::STRING);
|
static_cast<base::DictionaryValue*>(options.get());
|
||||||
if (path_value)
|
base::Value* pathValue =
|
||||||
file_path = path_value->GetString();
|
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()) {
|
} else if (options->is_string()) {
|
||||||
file_path = options->GetString();
|
file_path = options->GetString();
|
||||||
}
|
}
|
||||||
|
response_headers_->AddHeader(kCORSHeader);
|
||||||
|
|
||||||
if (file_path.empty()) {
|
if (file_path.empty()) {
|
||||||
NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
|
NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
|
||||||
|
@ -103,11 +116,7 @@ void URLRequestAsyncAsarJob::Kill() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void URLRequestAsyncAsarJob::GetResponseInfo(net::HttpResponseInfo* info) {
|
void URLRequestAsyncAsarJob::GetResponseInfo(net::HttpResponseInfo* info) {
|
||||||
std::string status("HTTP/1.1 200 OK");
|
info->headers = response_headers_;
|
||||||
auto* headers = new net::HttpResponseHeaders(status);
|
|
||||||
|
|
||||||
headers->AddHeader(kCORSHeader);
|
|
||||||
info->headers = headers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
|
@ -26,6 +26,7 @@ class URLRequestAsyncAsarJob : public asar::URLRequestAsarJob, public JsAsker {
|
||||||
void Kill() override;
|
void Kill() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
scoped_refptr<net::HttpResponseHeaders> response_headers_;
|
||||||
base::WeakPtrFactory<URLRequestAsyncAsarJob> weak_factory_;
|
base::WeakPtrFactory<URLRequestAsyncAsarJob> weak_factory_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(URLRequestAsyncAsarJob);
|
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
|
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
|
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
|
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
|
`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) => {
|
it('sends object as response', (done) => {
|
||||||
const handler = (request, callback) => callback({ path: filePath })
|
const handler = (request, callback) => callback({ path: filePath })
|
||||||
protocol.registerFileProtocol(protocolName, handler, (error) => {
|
protocol.registerFileProtocol(protocolName, handler, (error) => {
|
||||||
|
|
Loading…
Add table
Reference in a new issue