bind static method
Future<McpOAuthLoopbackCallbackListener>
bind({
- InternetAddress? address,
- int port = 0,
- String path = _defaultCallbackPath,
Binds an RFC 8252 loopback redirect listener.
The default address tries the IPv4 loopback IP literal, then IPv6 when IPv4 is unavailable; the default port is ephemeral. Pass an explicit loopback address when one IP family is required.
Implementation
static Future<McpOAuthLoopbackCallbackListener> bind({
InternetAddress? address,
int port = 0,
String path = _defaultCallbackPath,
}) async {
if (address != null && !address.isLoopback) {
throw ArgumentError.value(
address,
'address',
'OAuth callbacks may bind only a loopback IP address.',
);
}
if (port < 0 || port > 65535) {
throw ArgumentError.value(port, 'port', 'Must be between 0 and 65535.');
}
if (!_validCallbackPath(path)) {
throw ArgumentError.value(
path,
'path',
'Must be an absolute, authority-free callback path without a query.',
);
}
late final HttpServer server;
if (address != null) {
server = await HttpServer.bind(address, port, shared: false);
} else {
try {
server = await HttpServer.bind(
InternetAddress.loopbackIPv4,
port,
shared: false,
);
} on SocketException {
server = await HttpServer.bind(
InternetAddress.loopbackIPv6,
port,
shared: false,
);
}
}
final redirectUri = Uri(
scheme: 'http',
host: server.address.address,
port: server.port,
path: path,
);
return McpOAuthLoopbackCallbackListener._(server, redirectUri);
}