Unix domain socket on Dart
🏷️
Photo by israel palacio on Unsplash
Dart で Unix domain socket やっていきます.
Support making HTTP requests through unix sockets
環境
2.17.0–94.0.dev 以上であれば動くはず.
$ dart --version
Dart SDK version: 2.17.6 (stable) (Tue Jul 12 12:54:37 2022 +0200) on "linux_x64"
Get
import 'dart:convert';
import 'dart:io';void main(List<String> arguments) async {
HttpClient client = HttpClient()
..connectionFactory = (Uri uri, String? proxyHost, int? proxyPort) {
assert(proxyHost == null);
assert(proxyPort == null);
var address = InternetAddress("/var/run/docker.sock",
type: InternetAddressType.unix);
return Socket.startConnect(address, 0);
}
..findProxy = (Uri uri) => 'DIRECT';final response =
await client.getUrl(Uri.parse('http://localhost/_ping')).then((request) {
return request.close();
});
print(response.statusCode);
final responseText = await response
.transform(utf8.decoder)
.fold('', (String x, String y) => x + y);
print(responseText);
client.close();
}
実行結果
$ dart run bin/socket.dart
200
OK
curl だとこれ相当です
$ curl --unix-socket /var/run/docker.sock http://localhost/_ping
OK
Post
import 'dart:convert';
import 'dart:io';void main(List<String> arguments) async {
HttpClient client = HttpClient()
..connectionFactory = (Uri uri, String? proxyHost, int? proxyPort) {
assert(proxyHost == null);
assert(proxyPort == null);
var address = InternetAddress("/var/run/docker.sock",
type: InternetAddressType.unix);
return Socket.startConnect(address, 0);
}
..findProxy = (Uri uri) => 'DIRECT';final data = {
'Image': 'hello-world',
};
final response = await client
.postUrl(Uri.parse('http://localhost/containers/create'))
.then((request) {
request.headers.contentType = ContentType('application', 'json');
request.write(json.encode(data));
return request.close();
});
print(response.statusCode);
final res = await postResponse
.transform(utf8.decoder)
.fold('', (String x, String y) => x + y);
print(res);
client.close();
}
実行結果
$ dart run bin/socket.dart
201
{"Id":"636416b53763d106d54555d4709992000bc7709826daaa1f350295bb12d51d1b","Warnings":[]}
curl だと
$ curl --unix-socket /var/run/docker.sock http://localhost/containers/create
-X POST -H "Content-Type: application/json" -d '{"Image": "hello-world"}'
{"Id":"ceb6473c162fbb5238703e07253ba5985938295b511453ca59e6b33a8cbbd224","Warnings":[]}