| Index: chrome/browser/net/websocket_experiment/websocket_experiment_task.h
|
| diff --git a/chrome/browser/net/websocket_experiment/websocket_experiment_task.h b/chrome/browser/net/websocket_experiment/websocket_experiment_task.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7bf3fddf20ccbf391bd4c496adefa9d8662b18aa
|
| --- /dev/null
|
| +++ b/chrome/browser/net/websocket_experiment/websocket_experiment_task.h
|
| @@ -0,0 +1,206 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +//
|
| +// WebSocket live experiment task.
|
| +// It will try the following scenario.
|
| +//
|
| +// - Fetch |http_url| within |url_fetch_deadline_ms| msec.
|
| +// If failed, the task is aborted (no http reachability)
|
| +//
|
| +// - Connect to |url| with WebSocket protocol within
|
| +// |websocket_onopen_deadline_ms| msec.
|
| +// Checks WebSocket connection can be established.
|
| +//
|
| +// - Send |websocket_hello_message| on the WebSocket connection and
|
| +// wait it from server within |websocket_hello_echoback_deadline_ms| msec.
|
| +// Checks message can be sent/received on the WebSocket connection.
|
| +//
|
| +// - Keep connection idle at least |websocket_idle_ms| msec.
|
| +// Checks WebSocket connection keep open in idle state.
|
| +//
|
| +// - Wait for some message from server within
|
| +// |websocket_receive_push_message_deadline_ms| msec, and echo it back.
|
| +// Checks server can push a message after connection has been idle.
|
| +//
|
| +// - Expect that |websocket_bye_message| message arrives within
|
| +// |websocket_bye_deadline_ms| msec from server.
|
| +// Checks previous message was sent to the server.
|
| +//
|
| +// - Close the connection and wait |websocket_close_deadline_ms| msec
|
| +// for onclose.
|
| +// Checks WebSocket connection can be closed normally.
|
| +
|
| +#ifndef CHROME_BROWSER_NET_WEBSOCKET_EXPERIMENT_WEBSOCKET_EXPERIMENT_TASK_H_
|
| +#define CHROME_BROWSER_NET_WEBSOCKET_EXPERIMENT_WEBSOCKET_EXPERIMENT_TASK_H_
|
| +
|
| +#include <deque>
|
| +#include <string>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/task.h"
|
| +#include "base/time.h"
|
| +#include "chrome/browser/net/url_fetcher.h"
|
| +#include "googleurl/src/gurl.h"
|
| +#include "net/base/completion_callback.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/websockets/websocket.h"
|
| +
|
| +class MessageLoop;
|
| +
|
| +namespace net {
|
| +class WebSocket;
|
| +} // namespace net
|
| +
|
| +namespace chrome_browser_net_websocket_experiment {
|
| +
|
| +class WebSocketExperimentTask : public URLFetcher::Delegate,
|
| + public net::WebSocketDelegate {
|
| + public:
|
| + enum State {
|
| + STATE_NONE,
|
| + STATE_URL_FETCH,
|
| + STATE_URL_FETCH_COMPLETE,
|
| + STATE_WEBSOCKET_CONNECT,
|
| + STATE_WEBSOCKET_CONNECT_COMPLETE,
|
| + STATE_WEBSOCKET_SEND_HELLO,
|
| + STATE_WEBSOCKET_RECV_HELLO,
|
| + STATE_WEBSOCKET_KEEP_IDLE,
|
| + STATE_WEBSOCKET_KEEP_IDLE_COMPLETE,
|
| + STATE_WEBSOCKET_RECV_PUSH_MESSAGE,
|
| + STATE_WEBSOCKET_ECHO_BACK_MESSAGE,
|
| + STATE_WEBSOCKET_RECV_BYE,
|
| + STATE_WEBSOCKET_CLOSE,
|
| + STATE_WEBSOCKET_CLOSE_COMPLETE,
|
| + };
|
| + class Config {
|
| + public:
|
| + Config()
|
| + : url_fetch_deadline_ms(0),
|
| + websocket_onopen_deadline_ms(0),
|
| + websocket_hello_echoback_deadline_ms(0),
|
| + websocket_idle_ms(0),
|
| + websocket_receive_push_message_deadline_ms(0),
|
| + websocket_bye_deadline_ms(0),
|
| + websocket_close_deadline_ms(0) {}
|
| + GURL url;
|
| + std::string ws_protocol;
|
| + std::string ws_origin;
|
| + std::string ws_location;
|
| +
|
| + GURL http_url;
|
| +
|
| + int64 url_fetch_deadline_ms;
|
| + int64 websocket_onopen_deadline_ms;
|
| + std::string websocket_hello_message;
|
| + int64 websocket_hello_echoback_deadline_ms;
|
| + int64 websocket_idle_ms;
|
| + int64 websocket_receive_push_message_deadline_ms;
|
| + std::string websocket_bye_message;
|
| + int64 websocket_bye_deadline_ms;
|
| + int64 websocket_close_deadline_ms;
|
| + };
|
| + class Context {
|
| + public:
|
| + Context(const Config& config, WebSocketExperimentTask* task)
|
| + : config_(config), task_(task) {}
|
| + virtual ~Context() {}
|
| +
|
| + virtual URLFetcher* CreateURLFetcher();
|
| + virtual net::WebSocket* CreateWebSocket();
|
| +
|
| + protected:
|
| + const Config& config_;
|
| + WebSocketExperimentTask* task_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(Context);
|
| + };
|
| + class Result {
|
| + public:
|
| + Result()
|
| + : last_result(net::ERR_UNEXPECTED),
|
| + last_state(STATE_NONE) {}
|
| + int last_result;
|
| + State last_state;
|
| +
|
| + base::TimeDelta url_fetch;
|
| + base::TimeDelta websocket_connect;
|
| + base::TimeDelta websocket_echo;
|
| + base::TimeDelta websocket_idle;
|
| + };
|
| +
|
| + // WebSocketExperimentTask will call |callback| with the last status code
|
| + // when the task is finished.
|
| + WebSocketExperimentTask(const Config& config,
|
| + net::CompletionCallback* callback);
|
| + virtual ~WebSocketExperimentTask();
|
| +
|
| + void Run();
|
| +
|
| + const Result& GetResult() const {
|
| + return result_;
|
| + }
|
| +
|
| + // URLFetcher::Delegate method.
|
| + virtual void OnURLFetchComplete(const URLFetcher* source,
|
| + const GURL& url,
|
| + const URLRequestStatus& status,
|
| + int response_code,
|
| + const ResponseCookies& cookies,
|
| + const std::string& data);
|
| +
|
| + // net::WebSocketDelegate methods
|
| + virtual void OnOpen(net::WebSocket* websocket);
|
| + virtual void OnMessage(net::WebSocket* websocket, const std::string& msg);
|
| + virtual void OnClose(net::WebSocket* websocket);
|
| +
|
| + void SetContext(Context* context);
|
| +
|
| + private:
|
| + void OnTimedOut();
|
| +
|
| + void DoLoop(int result);
|
| +
|
| + int DoURLFetch();
|
| + int DoURLFetchComplete(int result);
|
| + int DoWebSocketConnect();
|
| + int DoWebSocketConnectComplete(int result);
|
| + int DoWebSocketSendHello();
|
| + int DoWebSocketReceiveHello(int result);
|
| + int DoWebSocketKeepIdle();
|
| + int DoWebSocketKeepIdleComplete(int result);
|
| + int DoWebSocketReceivePushMessage(int result);
|
| + int DoWebSocketEchoBackMessage();
|
| + int DoWebSocketReceiveBye(int result);
|
| + int DoWebSocketClose();
|
| + int DoWebSocketCloseComplete(int result);
|
| + void SetTimeout(int64 deadline_ms);
|
| + void RevokeTimeoutTimer();
|
| + void Finish(int result);
|
| +
|
| + Config config_;
|
| + scoped_ptr<Context> context_;
|
| + Result result_;
|
| +
|
| + MessageLoop* message_loop_;
|
| + ScopedRunnableMethodFactory<WebSocketExperimentTask> method_factory_;
|
| + net::CompletionCallback* callback_;
|
| + State next_state_;
|
| +
|
| + scoped_ptr<URLFetcher> url_fetcher_;
|
| + base::TimeTicks url_fetch_start_time_;
|
| +
|
| + scoped_refptr<net::WebSocket> websocket_;
|
| + std::deque<std::string> received_messages_;
|
| + std::string push_message_;
|
| + base::TimeTicks websocket_connect_start_time_;
|
| + base::TimeTicks websocket_echo_start_time_;
|
| + base::TimeTicks websocket_idle_start_time_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebSocketExperimentTask);
|
| +};
|
| +
|
| +} // namespace chrome_browser_net
|
| +
|
| +#endif // CHROME_BROWSER_NET_WEBSOCKET_EXPERIMENT_WEBSOCKET_EXPERIMENT_TASK_H_
|
|
|