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":[]}