2019-03-14 17:24:31 +00:00
|
|
|
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-03-14 17:24:31 +00:00
|
|
|
|
2019-04-29 08:22:36 +00:00
|
|
|
class AngelWings extends Driver<WingsClientSocket, int, WingsSocket,
|
|
|
|
WingsRequestContext, WingsResponseContext> {
|
2019-03-14 17:24:31 +00:00
|
|
|
factory AngelWings(Angel app) {
|
2019-04-26 23:22:30 +00:00
|
|
|
return AngelWings._(app, WingsSocket.bind);
|
2019-03-14 17:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
AngelWings._(
|
2019-04-26 23:11:58 +00:00
|
|
|
Angel app, Future<WingsSocket> Function(dynamic, int) serverGenerator)
|
2019-03-14 17:24:31 +00:00
|
|
|
: super(app, serverGenerator);
|
|
|
|
|
|
|
|
@override
|
|
|
|
void addCookies(int response, Iterable<Cookie> cookies) {
|
|
|
|
for (var cookie in cookies) {
|
|
|
|
setHeader(response, 'set-cookie', cookie.toString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future closeResponse(int response) {
|
2019-04-26 23:11:58 +00:00
|
|
|
closeNativeSocketDescriptor(response);
|
2019-03-14 17:24:31 +00:00
|
|
|
return Future.value();
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2019-04-30 17:40:11 +00:00
|
|
|
Future<WingsRequestContext> createRequestContext(
|
|
|
|
WingsClientSocket request, int response) {
|
2019-04-29 08:22:36 +00:00
|
|
|
return WingsRequestContext.from(app, request);
|
2019-03-14 17:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2019-04-30 17:40:11 +00:00
|
|
|
Future<WingsResponseContext> createResponseContext(
|
|
|
|
WingsClientSocket request, int response,
|
2019-03-14 17:24:31 +00:00
|
|
|
[WingsRequestContext correspondingRequest]) {
|
2019-04-30 17:40:11 +00:00
|
|
|
return Future.value(WingsResponseContext(
|
|
|
|
app, request.fileDescriptor, correspondingRequest));
|
2019-03-14 17:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2019-04-29 08:22:36 +00:00
|
|
|
Stream<int> createResponseStreamFromRawRequest(WingsClientSocket request) {
|
|
|
|
return Stream.fromIterable([request.fileDescriptor]);
|
2019-03-14 17:24:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setChunkedEncoding(int response, bool value) {
|
|
|
|
// TODO: implement setChunkedEncoding
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setContentLength(int response, int length) {
|
|
|
|
writeStringToResponse(response, 'content-length: $length\r\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void setHeader(int response, String key, String value) {
|
|
|
|
writeStringToResponse(response, '$key: $value\r\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
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 {
|
|
|
|
return Uri(scheme: 'http', host: server.address.address, port: server.port);
|
|
|
|
}
|
2019-03-14 17:24:31 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
void writeStringToResponse(int response, String value) {
|
|
|
|
writeToResponse(response, utf8.encode(value));
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void writeToResponse(int response, List<int> data) {
|
|
|
|
var buf = data is Uint8List ? data : Uint8List.fromList(data);
|
|
|
|
writeToNativeSocket(response, buf);
|
|
|
|
}
|
|
|
|
}
|