Caching response headers so that AtomURLRequest can be freed after the close event.
This commit is contained in:
parent
ec1fc5a17b
commit
e472d11761
4 changed files with 28 additions and 29 deletions
|
@ -51,7 +51,7 @@ struct Converter<scoped_refptr<const net::IOBufferWithSize>> {
|
||||||
auto size = node::Buffer::Length(val);
|
auto size = node::Buffer::Length(val);
|
||||||
|
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
// Support conversoin from empty buffer. A use case is
|
// Support conversion from empty buffer. A use case is
|
||||||
// a GET request without body.
|
// a GET request without body.
|
||||||
// Since zero-sized IOBuffer(s) are not supported, we set the
|
// Since zero-sized IOBuffer(s) are not supported, we set the
|
||||||
// out pointer to null.
|
// out pointer to null.
|
||||||
|
@ -60,7 +60,7 @@ struct Converter<scoped_refptr<const net::IOBufferWithSize>> {
|
||||||
}
|
}
|
||||||
auto data = node::Buffer::Data(val);
|
auto data = node::Buffer::Data(val);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
// This is an error as size is positif but data is null.
|
// This is an error as size is positive but data is null.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,13 +333,15 @@ void URLRequest::OnAuthenticationRequired(
|
||||||
base::Bind(&AtomURLRequest::PassLoginInformation, atom_request_));
|
base::Bind(&AtomURLRequest::PassLoginInformation, atom_request_));
|
||||||
}
|
}
|
||||||
|
|
||||||
void URLRequest::OnResponseStarted() {
|
void URLRequest::OnResponseStarted(
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders> response_headers) {
|
||||||
if (request_state_.Canceled() ||
|
if (request_state_.Canceled() ||
|
||||||
request_state_.Failed() ||
|
request_state_.Failed() ||
|
||||||
request_state_.Closed()) {
|
request_state_.Closed()) {
|
||||||
// Don't emit any event after request cancel.
|
// Don't emit any event after request cancel.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
response_headers_ = response_headers;
|
||||||
response_state_.SetFlag(ResponseStateFlags::kStarted);
|
response_state_.SetFlag(ResponseStateFlags::kStarted);
|
||||||
Emit("response");
|
Emit("response");
|
||||||
}
|
}
|
||||||
|
@ -386,35 +388,35 @@ void URLRequest::OnResponseError(const std::string& error) {
|
||||||
|
|
||||||
|
|
||||||
int URLRequest::StatusCode() const {
|
int URLRequest::StatusCode() const {
|
||||||
if (auto response_headers = atom_request_->GetResponseHeaders()) {
|
if (response_headers_) {
|
||||||
return response_headers->response_code();
|
return response_headers_->response_code();
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string URLRequest::StatusMessage() const {
|
std::string URLRequest::StatusMessage() const {
|
||||||
std::string result;
|
std::string result;
|
||||||
if (auto response_headers = atom_request_->GetResponseHeaders()) {
|
if (response_headers_) {
|
||||||
result = response_headers->GetStatusText();
|
result = response_headers_->GetStatusText();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
scoped_refptr<const net::HttpResponseHeaders>
|
scoped_refptr<const net::HttpResponseHeaders>
|
||||||
URLRequest::RawResponseHeaders() const {
|
URLRequest::RawResponseHeaders() const {
|
||||||
return atom_request_->GetResponseHeaders();
|
return response_headers_;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t URLRequest::ResponseHttpVersionMajor() const {
|
uint32_t URLRequest::ResponseHttpVersionMajor() const {
|
||||||
if (auto response_headers = atom_request_->GetResponseHeaders()) {
|
if (response_headers_) {
|
||||||
return response_headers->GetHttpVersion().major_value();
|
return response_headers_->GetHttpVersion().major_value();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t URLRequest::ResponseHttpVersionMinor() const {
|
uint32_t URLRequest::ResponseHttpVersionMinor() const {
|
||||||
if (auto response_headers = atom_request_->GetResponseHeaders()) {
|
if (response_headers_) {
|
||||||
return response_headers->GetHttpVersion().minor_value();
|
return response_headers_->GetHttpVersion().minor_value();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,8 @@ class URLRequest : public mate::EventEmitter<URLRequest> {
|
||||||
// Methods for reporting events into JavaScript.
|
// Methods for reporting events into JavaScript.
|
||||||
void OnAuthenticationRequired(
|
void OnAuthenticationRequired(
|
||||||
scoped_refptr<const net::AuthChallengeInfo> auth_info);
|
scoped_refptr<const net::AuthChallengeInfo> auth_info);
|
||||||
void OnResponseStarted();
|
void OnResponseStarted(
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders> response_headers);
|
||||||
void OnResponseData(scoped_refptr<const net::IOBufferWithSize> data);
|
void OnResponseData(scoped_refptr<const net::IOBufferWithSize> data);
|
||||||
void OnResponseCompleted();
|
void OnResponseCompleted();
|
||||||
void OnRequestError(const std::string& error);
|
void OnRequestError(const std::string& error);
|
||||||
|
@ -202,7 +203,7 @@ class URLRequest : public mate::EventEmitter<URLRequest> {
|
||||||
|
|
||||||
// Used to implement pin/unpin.
|
// Used to implement pin/unpin.
|
||||||
v8::Global<v8::Object> wrapper_;
|
v8::Global<v8::Object> wrapper_;
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders> response_headers_;
|
||||||
base::WeakPtrFactory<URLRequest> weak_ptr_factory_;
|
base::WeakPtrFactory<URLRequest> weak_ptr_factory_;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -126,15 +126,6 @@ void AtomURLRequest::RemoveExtraHeader(const std::string& name) const {
|
||||||
request_->RemoveRequestHeaderByName(name);
|
request_->RemoveRequestHeaderByName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
scoped_refptr<const net::HttpResponseHeaders>
|
|
||||||
AtomURLRequest::GetResponseHeaders() const {
|
|
||||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
|
||||||
return request_->response_headers();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AtomURLRequest::PassLoginInformation(const base::string16& username,
|
void AtomURLRequest::PassLoginInformation(const base::string16& username,
|
||||||
const base::string16& password) const {
|
const base::string16& password) const {
|
||||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||||
|
@ -173,7 +164,7 @@ void AtomURLRequest::DoWriteBuffer(
|
||||||
buffer->size(),
|
buffer->size(),
|
||||||
is_last);
|
is_last);
|
||||||
else if (is_last)
|
else if (is_last)
|
||||||
// Empty buffer and last chunck, i.e. request.end().
|
// Empty buffer and last chunk, i.e. request.end().
|
||||||
auto write_result = chunked_stream_writer_->AppendData(
|
auto write_result = chunked_stream_writer_->AppendData(
|
||||||
nullptr,
|
nullptr,
|
||||||
0,
|
0,
|
||||||
|
@ -233,12 +224,16 @@ void AtomURLRequest::OnResponseStarted(net::URLRequest* request) {
|
||||||
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
||||||
DCHECK_EQ(request, request_.get());
|
DCHECK_EQ(request, request_.get());
|
||||||
|
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders> response_headers =
|
||||||
|
request->response_headers();
|
||||||
const auto& status = request_->status();
|
const auto& status = request_->status();
|
||||||
if (status.is_success()) {
|
if (status.is_success()) {
|
||||||
// Success or pending trigger a Read.
|
// Success or pending trigger a Read.
|
||||||
content::BrowserThread::PostTask(
|
content::BrowserThread::PostTask(
|
||||||
content::BrowserThread::UI, FROM_HERE,
|
content::BrowserThread::UI, FROM_HERE,
|
||||||
base::Bind(&AtomURLRequest::InformDelegateResponseStarted, this));
|
base::Bind(&AtomURLRequest::InformDelegateResponseStarted,
|
||||||
|
this,
|
||||||
|
response_headers));
|
||||||
|
|
||||||
ReadResponse();
|
ReadResponse();
|
||||||
} else if (status.status() == net::URLRequestStatus::Status::FAILED) {
|
} else if (status.status() == net::URLRequestStatus::Status::FAILED) {
|
||||||
|
@ -337,10 +332,11 @@ void AtomURLRequest::InformDelegateAuthenticationRequired(
|
||||||
delegate_->OnAuthenticationRequired(auth_info);
|
delegate_->OnAuthenticationRequired(auth_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomURLRequest::InformDelegateResponseStarted() const {
|
void AtomURLRequest::InformDelegateResponseStarted(
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders> response_headers) const {
|
||||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||||
if (delegate_)
|
if (delegate_)
|
||||||
delegate_->OnResponseStarted();
|
delegate_->OnResponseStarted(response_headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomURLRequest::InformDelegateResponseData(
|
void AtomURLRequest::InformDelegateResponseData(
|
||||||
|
|
|
@ -38,7 +38,6 @@ class AtomURLRequest : public base::RefCountedThreadSafe<AtomURLRequest>,
|
||||||
void RemoveExtraHeader(const std::string& name) const;
|
void RemoveExtraHeader(const std::string& name) const;
|
||||||
void PassLoginInformation(const base::string16& username,
|
void PassLoginInformation(const base::string16& username,
|
||||||
const base::string16& password) const;
|
const base::string16& password) const;
|
||||||
scoped_refptr<const net::HttpResponseHeaders> GetResponseHeaders() const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Overrides of net::URLRequest::Delegate
|
// Overrides of net::URLRequest::Delegate
|
||||||
|
@ -66,7 +65,8 @@ class AtomURLRequest : public base::RefCountedThreadSafe<AtomURLRequest>,
|
||||||
|
|
||||||
void InformDelegateAuthenticationRequired(
|
void InformDelegateAuthenticationRequired(
|
||||||
scoped_refptr<net::AuthChallengeInfo> auth_info) const;
|
scoped_refptr<net::AuthChallengeInfo> auth_info) const;
|
||||||
void InformDelegateResponseStarted() const;
|
void InformDelegateResponseStarted(
|
||||||
|
scoped_refptr<const net::HttpResponseHeaders>) const;
|
||||||
void InformDelegateResponseData(
|
void InformDelegateResponseData(
|
||||||
scoped_refptr<net::IOBufferWithSize> data) const;
|
scoped_refptr<net::IOBufferWithSize> data) const;
|
||||||
void InformDelegateResponseCompleted() const;
|
void InformDelegateResponseCompleted() const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue