Ported resolve_url from https://codeberg.org/outbag/app/src/branch/develop/deps/outbag-core/src/resolve_url.js
This commit is contained in:
parent
955a01d368
commit
fd2e21c328
1 changed files with 81 additions and 0 deletions
81
lib/backend/resolve_url.dart
Normal file
81
lib/backend/resolve_url.dart
Normal file
|
@ -0,0 +1,81 @@
|
|||
import 'package:localstore/localstore.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'dart:convert';
|
||||
|
||||
const String wellKnownPath = "/.well-known/outbag/server";
|
||||
const int defaultPort = 7223;
|
||||
|
||||
Future<Uri> fetchWellKnown(String host, int port) async {
|
||||
Uri uri = Uri(path: wellKnownPath, host: host, port: port, scheme: "https");
|
||||
final resp = await http.get(uri);
|
||||
final json = jsonDecode(resp.body);
|
||||
|
||||
return Uri(host: host, path: json['path'], port: json['port']);
|
||||
}
|
||||
|
||||
class OutbagServer {
|
||||
final String host;
|
||||
final int port;
|
||||
final String path;
|
||||
|
||||
final String tag;
|
||||
|
||||
const OutbagServer(
|
||||
{required this.host,
|
||||
required this.port,
|
||||
required this.path,
|
||||
required this.tag});
|
||||
|
||||
String get base {
|
||||
return Uri(
|
||||
host: host,
|
||||
port: port,
|
||||
path: path,
|
||||
scheme: 'https',
|
||||
).toString();
|
||||
}
|
||||
|
||||
void toDisk() async {
|
||||
final db = Localstore.instance;
|
||||
await db
|
||||
.collection('meta')
|
||||
.doc('server')
|
||||
.set({'host': host, 'port': port, 'path': path, 'tag': tag});
|
||||
}
|
||||
|
||||
static Future<OutbagServer> fromDisk() async {
|
||||
final db = Localstore.instance;
|
||||
final data = await db.collection('meta').doc('server').get();
|
||||
|
||||
return OutbagServer(
|
||||
tag: data?['tag'],
|
||||
host: data?['host'],
|
||||
path: data?['path'],
|
||||
port: data?['port']);
|
||||
}
|
||||
}
|
||||
|
||||
Future<OutbagServer> getOutbagServerUrl(String tag) async {
|
||||
final rootUri = Uri.parse(tag.startsWith('https://') ? tag : 'https://$tag');
|
||||
|
||||
bool onRoot = rootUri.port == 443;
|
||||
|
||||
try {
|
||||
final uri = await fetchWellKnown(rootUri.host, rootUri.port);
|
||||
return OutbagServer(
|
||||
host: rootUri.host,
|
||||
port: uri.port,
|
||||
path: uri.path,
|
||||
tag: onRoot ? rootUri.host : '$rootUri.host:$uri.port');
|
||||
} catch (_) {
|
||||
if (onRoot) {
|
||||
final uri = await fetchWellKnown(rootUri.host, defaultPort);
|
||||
return OutbagServer(
|
||||
host: rootUri.host,
|
||||
port: uri.port,
|
||||
path: uri.path,
|
||||
tag: onRoot ? rootUri.host : '$rootUri.host:$uri.port');
|
||||
}
|
||||
}
|
||||
throw Error();
|
||||
}
|
Loading…
Reference in a new issue