#include "base/metrics/sparse_histogram.h"
#include "net/base/load_flags.h"
#include "net/http/http_request_headers.h"
+#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
+#include "net/url_request/redirect_info.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context.h"
#include "net/websockets/websocket_errors.h"
// Implementation of URLRequest::Delegate methods.
virtual void OnReceivedRedirect(URLRequest* request,
- const GURL& new_url,
+ const RedirectInfo& redirect_info,
bool* defer_redirect) OVERRIDE {
// HTTP status codes returned by HttpStreamParser are filtered by
// WebSocketBasicHandshakeStream, and only 101, 401 and 407 are permitted
}
void PerformUpgrade() {
- connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade());
+ connect_delegate_->OnSuccess(create_helper_->Upgrade());
}
void ReportFailure() {
break;
}
}
- connect_delegate_->OnFailure(failure_message_);
+ ReportFailureWithMessage(failure_message_);
+ }
+
+ void ReportFailureWithMessage(const std::string& failure_message) {
+ connect_delegate_->OnFailure(failure_message);
+ }
+
+ void OnFinishOpeningHandshake() {
+ WebSocketDispatchOnFinishOpeningHandshake(connect_delegate(),
+ url_request_.url(),
+ url_request_.response_headers(),
+ url_request_.response_time());
}
WebSocketStream::ConnectDelegate* connect_delegate() const {
return;
case HTTP_UNAUTHORIZED:
+ result_ = FAILED;
+ owner_->OnFinishOpeningHandshake();
+ owner_->ReportFailureWithMessage(
+ "HTTP Authentication failed; no valid credentials available");
+ return;
+
case HTTP_PROXY_AUTHENTICATION_REQUIRED:
+ result_ = FAILED;
+ owner_->OnFinishOpeningHandshake();
+ owner_->ReportFailureWithMessage("Proxy authentication failed");
return;
default:
return request.PassAs<WebSocketStreamRequest>();
}
+void WebSocketDispatchOnFinishOpeningHandshake(
+ WebSocketStream::ConnectDelegate* connect_delegate,
+ const GURL& url,
+ const scoped_refptr<HttpResponseHeaders>& headers,
+ base::Time response_time) {
+ DCHECK(connect_delegate);
+ if (headers) {
+ connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr(
+ new WebSocketHandshakeResponseInfo(url,
+ headers->response_code(),
+ headers->GetStatusText(),
+ headers,
+ response_time)));
+ }
+}
+
} // namespace net