Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / net / websockets / websocket_stream.cc
index 8ddce8d..c9513d7 100644 (file)
@@ -10,7 +10,9 @@
 #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"
@@ -45,7 +47,7 @@ class Delegate : public URLRequest::Delegate {
 
   // 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
@@ -114,7 +116,7 @@ class StreamRequestImpl : public WebSocketStreamRequest {
   }
 
   void PerformUpgrade() {
-    connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade());
+    connect_delegate_->OnSuccess(create_helper_->Upgrade());
   }
 
   void ReportFailure() {
@@ -133,7 +135,18 @@ class StreamRequestImpl : public WebSocketStreamRequest {
           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 {
@@ -198,7 +211,16 @@ void Delegate::OnResponseStarted(URLRequest* request) {
       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:
@@ -285,4 +307,20 @@ scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting(
   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