open-story-teller/story-player/lib/httpserver.dart
anthony@rabine.fr 149a8b6276
Some checks failed
Build-StoryEditor / build_linux (push) Has been cancelled
Build-StoryEditor / build_win32 (push) Has been cancelled
merged jump/call implementation, removed jumpr
2025-10-18 23:14:30 +02:00

103 lines
3.4 KiB
Dart

import 'dart:io';
import 'dart:convert';
import 'dart:async';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_router/shelf_router.dart';
import 'package:mime/mime.dart';
import 'package:path/path.dart' as p;
import 'package:http_parser/http_parser.dart'; // y'a un warning mais il faut laisser cet import
import 'package:logger/logger.dart';
var logger = Logger(printer: PrettyPrinter(methodCount: 0));
void httpServer() async {
final router = Router();
// Route pour uploader des fichiers
router.post('/upload', (Request request) async {
var contentType = MediaType.parse(request.headers['content-type']!);
var boundary = contentType.parameters['boundary']!;
var transformer = MimeMultipartTransformer(boundary);
var bodyStream = request.read();
var parts = await transformer.bind(bodyStream).toList();
for (var part in parts) {
var contentDisp = part.headers['content-disposition']!;
var filename = _extractFilename(contentDisp);
if (filename != null) {
var filePath = p.join('uploads', filename);
await _saveFile(part, filePath);
logger.d('File uploaded: $filePath');
}
}
return Response.ok('File uploaded successfully');
});
// Route pour lister les fichiers
router.get('/files', (Request request) async {
final directory = Directory('uploads');
final files =
directory.listSync().map((file) => p.basename(file.path)).toList();
final json = {'files': files};
return Response.ok(jsonEncode(json),
headers: {'Content-Type': 'application/json'});
});
// Démarrer le serveur
io.serve(router.call, 'localhost', 8080).then((server) {
logger.d('Serving at http://${server.address.host}:${server.port}');
});
}
String? _extractFilename(String contentDisposition) {
return RegExp('filename="([^"]*)"').firstMatch(contentDisposition)?.group(1);
}
Future<void> _saveFile(MimeMultipart part, String filename) async {
var file = File(filename);
await file.create(recursive: true);
await part.pipe(file.openWrite());
}
void udpServer() async {
// Créer un socket UDP
var port = 8080; // Vous pouvez spécifier le port de votre choix
var address =
InternetAddress.anyIPv4; // Écouter sur toutes les interfaces IPv4
RawDatagramSocket socket = await RawDatagramSocket.bind(address, port);
logger.d('Serveur UDP écoutant sur ${address.address}:$port');
// Gérer les événements du socket
socket.listen((RawSocketEvent event) {
if (event == RawSocketEvent.read) {
Datagram? datagram = socket.receive();
if (datagram != null) {
var message = utf8.decode(datagram.data);
logger.d(
'Message reçu de ${datagram.address.address}:${datagram.port}: $message');
// Envoyer une réponse
String response = 'Reçu: $message';
List<int> data = utf8.encode(response);
socket.send(data, datagram.address, datagram.port);
logger.d(
'Réponse envoyée à ${datagram.address.address}:${datagram.port}');
}
}
});
}
Future printIps() async {
for (var interface in await NetworkInterface.list()) {
logger.d('== Interface: ${interface.name} ==');
for (var addr in interface.addresses) {
logger.d(
'${addr.address} ${addr.host} ${addr.isLoopback} ${addr.rawAddress} ${addr.type.name}');
}
}
}