Skip to content

Commit 862ca32

Browse files
committed
Add WebSocketSettings, fix #103.
1 parent 00e919b commit 862ca32

File tree

5 files changed

+53
-33
lines changed

5 files changed

+53
-33
lines changed

example/lib/src/register.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,12 @@ class _MyRegisterWidget extends State<RegisterWidget>
4141
}
4242

4343
void _loadSettings() async {
44-
_preferences = await SharedPreferences.getInstance();
44+
_preferences = await SharedPreferences.getInstance();
4545
this.setState(() {
46-
_wsUri = _preferences.getString('ws_uri') ?? 'wss://tryit.jssip.net:10443';
47-
_sipUri = _preferences.getString('sip_uri') ?? '[email protected]';
46+
_wsUri =
47+
_preferences.getString('ws_uri') ?? 'wss://tryit.jssip.net:10443';
48+
_sipUri =
49+
_preferences.getString('sip_uri') ?? '[email protected]';
4850
_displayName = _preferences.getString('display_name') ?? 'Flutter SIP UA';
4951
_password = _preferences.getString('password');
5052
_authorizationUser = _preferences.getString('auth_user');
@@ -97,12 +99,14 @@ class _MyRegisterWidget extends State<RegisterWidget>
9799
UaSettings settings = UaSettings();
98100

99101
settings.webSocketUrl = _wsUri;
102+
settings.webSocketSettings.extraHeaders = _wsExtraHeaders;
103+
settings.webSocketSettings.allowBadCertificate = true;
104+
settings.webSocketSettings.userAgent = 'Dart/2.8 (dart:io) for OpenSIPS.';
105+
100106
settings.uri = _sipUri;
101107
settings.authorizationUser = _authorizationUser;
102108
settings.password = _password;
103109
settings.displayName = _displayName;
104-
settings.webSocketExtraHeaders = _wsExtraHeaders;
105-
settings.allowBadCertificate = true;
106110
settings.userAgent = 'Dart SIP Client v1.0.0';
107111

108112
helper.start(settings);
@@ -187,7 +191,6 @@ class _MyRegisterWidget extends State<RegisterWidget>
187191
),
188192
],
189193
),
190-
191194
Column(
192195
children: <Widget>[
193196
Padding(

lib/src/sip_ua_helper.dart

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ class SIPUAHelper extends EventManager {
9494
_uaSettings = uaSettings;
9595

9696
_settings = Settings();
97-
var socket = WebSocketInterface(uaSettings.webSocketUrl,
98-
uaSettings.webSocketExtraHeaders, uaSettings.allowBadCertificate);
97+
var socket = WebSocketInterface(
98+
uaSettings.webSocketUrl, uaSettings.webSocketSettings);
9999
_settings.sockets = [socket];
100100
_settings.uri = uaSettings.uri;
101101
_settings.password = uaSettings.password;
@@ -516,10 +516,23 @@ abstract class SipUaHelperListener {
516516
void onNewMessage(SIPMessageRequest msg);
517517
}
518518

519+
class WebSocketSettings {
520+
/// Add additional HTTP headers, such as:'Origin','Host' or others
521+
Map<String, dynamic> extraHeaders = {};
522+
523+
/// `User Agent` field for dart http client.
524+
String userAgent;
525+
526+
/// Don‘t check the server certificate
527+
/// for self-signed certificate.
528+
bool allowBadCertificate = false;
529+
}
530+
519531
class UaSettings {
520532
String webSocketUrl;
521-
Map<String, dynamic> webSocketExtraHeaders;
522-
bool allowBadCertificate = false;
533+
WebSocketSettings webSocketSettings = WebSocketSettings();
534+
535+
/// `User Agent` field for sip message.
523536
String userAgent;
524537
String uri;
525538
String authorizationUser;

lib/src/transports/websocket_dart_impl.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'dart:io';
22
import 'dart:math';
33
import 'dart:convert';
44
import 'dart:async';
5+
import 'package:sip_ua/src/sip_ua_helper.dart';
6+
57
import '../logger.dart';
68
import '../grammar.dart';
79

@@ -19,19 +21,17 @@ class WebSocketImpl {
1921
WebSocketImpl(this._url);
2022

2123
void connect(
22-
{Iterable<String> protocols,
23-
Map<String, String> extHeaders,
24-
bool allowBadCertificate = false}) async {
25-
logger.info('connect $_url, $extHeaders, $protocols');
24+
{Iterable<String> protocols, WebSocketSettings webSocketSettings}) async {
25+
logger.info('connect $_url, ${webSocketSettings.extraHeaders}, $protocols');
2626
try {
27-
if (allowBadCertificate) {
27+
if (webSocketSettings.allowBadCertificate) {
2828
/// Allow self-signed certificate, for test only.
2929
var parsed_url = Grammar.parse(_url, 'absoluteURI');
30-
_socket = await _connectForBadCertificate(
31-
parsed_url.scheme, parsed_url.host, parsed_url.port, extHeaders);
30+
_socket = await _connectForBadCertificate(parsed_url.scheme,
31+
parsed_url.host, parsed_url.port, webSocketSettings);
3232
} else {
3333
_socket = await WebSocket.connect(_url,
34-
protocols: protocols, headers: extHeaders);
34+
protocols: protocols, headers: webSocketSettings.extraHeaders);
3535
}
3636

3737
this?.onOpen();
@@ -62,12 +62,17 @@ class WebSocketImpl {
6262

6363
/// For test only.
6464
Future<WebSocket> _connectForBadCertificate(String scheme, String host,
65-
int port, Map<String, String> extHeaders) async {
65+
int port, WebSocketSettings webSocketSettings) async {
6666
try {
6767
var r = new Random();
6868
var key = base64.encode(List<int>.generate(8, (_) => r.nextInt(255)));
6969
var securityContext = new SecurityContext();
7070
var client = HttpClient(context: securityContext);
71+
72+
if (webSocketSettings.userAgent != null) {
73+
client.userAgent = webSocketSettings.userAgent;
74+
}
75+
7176
client.badCertificateCallback =
7277
(X509Certificate cert, String host, int port) {
7378
logger.warn('Allow self-signed certificate => $host:$port. ');
@@ -86,7 +91,7 @@ class WebSocketImpl {
8691

8792
//request.headers.add('Origin', 'http://localhost:5060');
8893
//request.headers.add('Sec-WebSocket-Protocol', 'sip');
89-
extHeaders.forEach((key, value) {
94+
webSocketSettings.extraHeaders.forEach((key, value) {
9095
request.headers.add(key, value);
9196
});
9297

lib/src/transports/websocket_interface.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'dart:async';
22
import 'dart:convert';
3+
import 'package:sip_ua/sip_ua.dart';
4+
35
import 'websocket_dart_impl.dart'
46
if (dart.library.js) 'websocket_web_impl.dart';
57
import 'dart:math';
@@ -19,7 +21,7 @@ class WebSocketInterface implements Socket {
1921
var _closed = false;
2022
var _connected = false;
2123
var weight;
22-
Map<String, dynamic> _wsExtraHeaders;
24+
WebSocketSettings _webSocketSettings;
2325

2426
final logger = Log();
2527
@override
@@ -31,8 +33,7 @@ class WebSocketInterface implements Socket {
3133
@override
3234
void Function(dynamic data) ondata;
3335

34-
WebSocketInterface(String url,
35-
[Map<String, dynamic> wsExtraHeaders, bool allowBadCertificate]) {
36+
WebSocketInterface(String url, [WebSocketSettings webSocketSettings]) {
3637
logger.debug('new() [url:' + url + ']');
3738
this._url = url;
3839
var parsed_url = Grammar.parse(url, 'absoluteURI');
@@ -49,8 +50,7 @@ class WebSocketInterface implements Socket {
4950
logger.debug('SIP URI: ${this._sip_uri}');
5051
this._via_transport = parsed_url.scheme.toUpperCase();
5152
}
52-
this._wsExtraHeaders = wsExtraHeaders ?? {};
53-
this._allowBadCertificate = allowBadCertificate ?? false;
53+
this._webSocketSettings = webSocketSettings ?? WebSocketSettings();
5454
}
5555

5656
@override
@@ -100,10 +100,9 @@ class WebSocketInterface implements Socket {
100100
this._onClose(true, closeCode, closeReason);
101101
};
102102

103-
await this._ws.connect(extHeaders: {
104-
'Sec-WebSocket-Protocol': _websocket_protocol,
105-
...this._wsExtraHeaders
106-
}, allowBadCertificate: this._allowBadCertificate);
103+
await _ws.connect(
104+
protocols: [_websocket_protocol],
105+
webSocketSettings: _webSocketSettings);
107106
} catch (e, s) {
108107
Log.e(e.toString(), null, s);
109108
_connected = false;

lib/src/transports/websocket_web_impl.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'dart:html';
22
import 'dart:js_util' as JSUtils;
3+
import 'package:sip_ua/src/sip_ua_helper.dart';
4+
35
import '../logger.dart';
46

57
typedef void OnMessageCallback(dynamic msg);
@@ -17,10 +19,8 @@ class WebSocketImpl {
1719
WebSocketImpl(this._url);
1820

1921
void connect(
20-
{Iterable<String> protocols,
21-
Map<String, String> extHeaders,
22-
bool allowBadCertificate = false}) async {
23-
logger.info('connect $_url, $extHeaders, $protocols');
22+
{Iterable<String> protocols, WebSocketSettings webSocketSettings}) async {
23+
logger.info('connect $_url, ${webSocketSettings.extraHeaders}, $protocols');
2424
try {
2525
_socket = WebSocket(_url, 'sip');
2626
_socket.onOpen.listen((e) {

0 commit comments

Comments
 (0)