buildFilterConnections function
Implementation
Future<bool> Function(HttpRequest request) buildFilterConnections({
FutureOr<GameProperty> Function(HttpRequest request)? loadProperty,
FutureOr<ServerThumbnail?> Function(HttpRequest request)? loadThumbnail,
}) => (request) async {
final response = request.response;
response.headers.add("Access-Control-Allow-Origin", "*");
response.headers.add("Access-Control-Allow-Methods", "GET,OPTIONS");
response.headers.add("Access-Control-Allow-Headers", "X-Setonix-Method");
response.headers.add("Access-Control-Expose-Headers", "Content-Length");
response.statusCode = HttpStatus.ok;
if (request.method == 'OPTIONS') {
response.close();
return false;
}
String? sendMessage;
try {
final method = request.headers.value('X-Setonix-Method');
if (method == kInfoMethod) {
sendMessage =
((await loadProperty?.call(request)) ?? GameProperty.defaultProperty)
.toJson();
} else if (method == kThumbnailMethod) {
final thumbnail = await loadThumbnail?.call(request);
if (thumbnail == null) {
response.statusCode = HttpStatus.notFound;
response.close();
return false;
}
if (!kAllowedThumbnailContentTypes.contains(thumbnail.contentType) ||
thumbnail.bytes.length > kMaxThumbnailSize) {
response.statusCode = HttpStatus.unsupportedMediaType;
response.close();
return false;
}
response.headers.contentType = ContentType.parse(thumbnail.contentType);
response.headers.contentLength = thumbnail.bytes.length;
response.add(thumbnail.bytes);
response.close();
return false;
}
} catch (_) {}
if (sendMessage != null) {
response.statusCode = HttpStatus.ok;
response.write(sendMessage);
response.close();
return false;
}
return true;
};