| Index: sdk/lib/io/http_impl.dart
|
| diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
|
| index 5d1d53598e03a37bcf3a8731819c1c62738df1f8..f9fedc3410bf898fec9521989910eeef3ea6c366 100644
|
| --- a/sdk/lib/io/http_impl.dart
|
| +++ b/sdk/lib/io/http_impl.dart
|
| @@ -1992,13 +1992,18 @@ class _HttpClient implements HttpClient {
|
| }
|
|
|
|
|
| -class _HttpConnection extends LinkedListEntry<_HttpConnection> {
|
| +class _HttpConnection
|
| + extends LinkedListEntry<_HttpConnection> with _ServiceObject {
|
| static const _ACTIVE = 0;
|
| static const _IDLE = 1;
|
| static const _CLOSING = 2;
|
| static const _DETACHED = 3;
|
|
|
| - final Socket _socket;
|
| + // Use HashMap, as we don't need to keep order.
|
| + static Map<int, _HttpConnection> _connections =
|
| + new HashMap<int, _HttpConnection>();
|
| +
|
| + final _socket;
|
| final _HttpServer _httpServer;
|
| final _HttpParser _httpParser;
|
| int _state = _IDLE;
|
| @@ -2009,6 +2014,8 @@ class _HttpConnection extends LinkedListEntry<_HttpConnection> {
|
|
|
| _HttpConnection(this._socket, this._httpServer)
|
| : _httpParser = new _HttpParser.requestParser() {
|
| + try { _socket._owner = this; } catch (_) { print(_); }
|
| + _connections[_serviceId] = this;
|
| _httpParser.listenToStream(_socket);
|
| _subscription = _httpParser.listen(
|
| (incoming) {
|
| @@ -2074,6 +2081,7 @@ class _HttpConnection extends LinkedListEntry<_HttpConnection> {
|
| _state = _CLOSING;
|
| _socket.destroy();
|
| _httpServer._connectionClosed(this);
|
| + _connections.remove(_serviceId);
|
| }
|
|
|
| Future<Socket> detachSocket() {
|
| @@ -2084,6 +2092,7 @@ class _HttpConnection extends LinkedListEntry<_HttpConnection> {
|
| _HttpDetachedIncoming detachedIncoming = _httpParser.detachIncoming();
|
|
|
| return _streamFuture.then((_) {
|
| + _connections.remove(_serviceId);
|
| return new _DetachedSocket(_socket, detachedIncoming);
|
| });
|
| }
|
| @@ -2094,6 +2103,42 @@ class _HttpConnection extends LinkedListEntry<_HttpConnection> {
|
| bool get _isIdle => _state == _IDLE;
|
| bool get _isClosing => _state == _CLOSING;
|
| bool get _isDetached => _state == _DETACHED;
|
| +
|
| + String get _serviceTypePath => 'io/http/serverconnections';
|
| + String get _serviceTypeName => 'HttpServerConnection';
|
| +
|
| + Map _toJSON(bool ref) {
|
| + var name = "${_socket.address.host}:${_socket.port} <-> "
|
| + "${_socket.remoteAddress.host}:${_socket.remotePort}";
|
| + var r = {
|
| + 'id': _servicePath,
|
| + 'type': _serviceType(ref),
|
| + 'name': name,
|
| + 'user_name': name,
|
| + };
|
| + if (ref) {
|
| + return r;
|
| + }
|
| + r['server'] = _httpServer._toJSON(true);
|
| + try {
|
| + r['socket'] = _socket._toJSON(true);
|
| + } catch (_) {
|
| + r['socket'] = {
|
| + 'id': _servicePath,
|
| + 'type': '@Socket',
|
| + 'name': 'UserSocket',
|
| + 'user_name': 'UserSocket',
|
| + };
|
| + }
|
| + switch (_state) {
|
| + case _ACTIVE: r['state'] = "Active"; break;
|
| + case _IDLE: r['state'] = "Idle"; break;
|
| + case _CLOSING: r['state'] = "Closing"; break;
|
| + case _DETACHED: r['state'] = "Detached"; break;
|
| + default: r['state'] = 'Unknown'; break;
|
| + }
|
| + return r;
|
| + }
|
| }
|
|
|
|
|
| @@ -2323,8 +2368,8 @@ class _HttpServer
|
| }
|
| r['port'] = port;
|
| r['address'] = address.host;
|
| - r['active'] = _activeConnections.length;
|
| - r['idle'] = _idleConnections.length;
|
| + r['active'] = _activeConnections.map((c) => c._toJSON(true)).toList();
|
| + r['idle'] = _idleConnections.map((c) => c._toJSON(true)).toList();
|
| r['closed'] = closed;
|
| return r;
|
| }
|
|
|