platform/packages/wings/lib/src/wings_driver.dart

99 lines
2.6 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'dart:convert';
import 'dart:io' show Cookie;
import 'dart:typed_data';
import 'package:angel_framework/angel_framework.dart';
import 'wings_request.dart';
import 'wings_response.dart';
2019-04-26 23:22:30 +00:00
import 'wings_socket.dart';
2019-05-01 04:29:21 +00:00
Future<WingsSocket> startSharedWings(dynamic addr, int port) {
return WingsSocket.bind(addr, port, shared: true);
}
2021-06-20 12:37:20 +00:00
class AngelWings extends Driver<WingsClientSocket, int?, WingsSocket,
2019-04-29 08:22:36 +00:00
WingsRequestContext, WingsResponseContext> {
factory AngelWings(Angel app) {
2019-05-01 04:29:21 +00:00
return AngelWings.custom(app, WingsSocket.bind);
}
2019-05-01 04:29:21 +00:00
AngelWings.custom(
2019-04-26 23:11:58 +00:00
Angel app, Future<WingsSocket> Function(dynamic, int) serverGenerator)
: super(app, serverGenerator);
@override
2021-06-20 12:37:20 +00:00
void addCookies(int? response, Iterable<Cookie> cookies) {
for (var cookie in cookies) {
setHeader(response, 'set-cookie', cookie.toString());
}
}
2019-05-01 04:29:21 +00:00
@override
2021-06-20 12:37:20 +00:00
Future<void> close() async {
2019-05-01 04:29:21 +00:00
await server?.close();
return super.close();
}
@override
2021-06-20 12:37:20 +00:00
Future closeResponse(int? response) {
2019-04-26 23:11:58 +00:00
closeNativeSocketDescriptor(response);
return Future.value();
}
@override
2019-04-30 17:40:11 +00:00
Future<WingsRequestContext> createRequestContext(
2021-06-20 12:37:20 +00:00
WingsClientSocket request, int? response) {
2019-04-29 08:22:36 +00:00
return WingsRequestContext.from(app, request);
}
@override
2019-04-30 17:40:11 +00:00
Future<WingsResponseContext> createResponseContext(
2021-06-20 12:37:20 +00:00
WingsClientSocket request, int? response,
[WingsRequestContext? correspondingRequest]) {
2019-04-30 17:40:11 +00:00
return Future.value(WingsResponseContext(
app, request.fileDescriptor, correspondingRequest));
}
@override
2021-06-20 12:37:20 +00:00
Stream<int?> createResponseStreamFromRawRequest(WingsClientSocket request) {
2019-04-29 08:22:36 +00:00
return Stream.fromIterable([request.fileDescriptor]);
}
@override
2021-06-20 12:37:20 +00:00
void setChunkedEncoding(int? response, bool value) {
// TODO: implement setChunkedEncoding
}
@override
2021-06-20 12:37:20 +00:00
void setContentLength(int? response, int length) {
writeStringToResponse(response, 'content-length: $length\r\n');
}
@override
2021-06-20 12:37:20 +00:00
void setHeader(int? response, String key, String value) {
writeStringToResponse(response, '$key: $value\r\n');
}
@override
2021-06-20 12:37:20 +00:00
void setStatusCode(int? response, int value) {
// HTTP-Version SP Status-Code SP Reason-Phrase CRLF
writeStringToResponse(response, 'HTTP/1.1 $value\r\n');
}
@override
2019-04-30 17:40:11 +00:00
Uri get uri {
2021-06-20 12:37:20 +00:00
return Uri(scheme: 'http', host: server!.address.address, port: server!.port);
2019-04-30 17:40:11 +00:00
}
@override
2021-06-20 12:37:20 +00:00
void writeStringToResponse(int? response, String value) {
writeToResponse(response, utf8.encode(value));
}
@override
2021-06-20 12:37:20 +00:00
void writeToResponse(int? response, List<int> data) {
var buf = data is Uint8List ? data : Uint8List.fromList(data);
writeToNativeSocket(response, buf);
}
}