From 61fdef1df97d7f180696a704c3a1b0141b5ecc6d Mon Sep 17 00:00:00 2001 From: Tobe O Date: Tue, 30 Apr 2019 13:40:11 -0400 Subject: [PATCH] Almost done --- .gitignore | 4 ++-- Makefile | 2 +- example/main.dart | 12 +++++------- example/pretty_log.dart | 35 +++++++++++++++++++++++++++++++++++ lib/src/libangel_wings.dylib | Bin 0 -> 83512 bytes lib/src/wings_driver.dart | 14 +++++++++----- lib/src/wings_request.dart | 12 +++++++++--- lib/src/wings_response.dart | 33 ++++++++++++++++----------------- lib/src/wings_socket.dart | 5 ++++- libangel_wings.dylib | Bin 0 -> 83512 bytes pubspec.yaml | 1 + 11 files changed, 82 insertions(+), 36 deletions(-) create mode 100644 example/pretty_log.dart create mode 100644 lib/src/libangel_wings.dylib create mode 100644 libangel_wings.dylib diff --git a/.gitignore b/.gitignore index 8078e48d..c40e7bad 100644 --- a/.gitignore +++ b/.gitignore @@ -21,9 +21,9 @@ doc/api/ *.js.map *.o -*.dylib +# *.dylib *.a -*.so +# *.so *.lib *.obj diff --git a/Makefile b/Makefile index 07bb2b86..6ac0c8ed 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ libangel_wings.dylib: lib/src/libangel_wings.dylib lib/src/libangel_wings.dylib: $(objects) %.dylib: $(objects) - $(CXX) -shared -undefined dynamic_lookup -o $@ $^ + $(CXX) -shared -Wl,-undefined -Wl,dynamic_lookup -o $@ $^ %.so: $(objects) $(CXX) -shared -o $@ $^ diff --git a/example/main.dart b/example/main.dart index b14aeae2..c5f4e13d 100644 --- a/example/main.dart +++ b/example/main.dart @@ -3,6 +3,7 @@ import 'package:angel_static/angel_static.dart'; import 'package:angel_wings/angel_wings.dart'; import 'package:file/local.dart'; import 'package:logging/logging.dart'; +import 'pretty_log.dart'; main() async { var app = Angel(); @@ -10,17 +11,14 @@ main() async { var fs = LocalFileSystem(); var vDir = CachingVirtualDirectory(app, fs, source: fs.currentDirectory, allowDirectoryListing: true); - app.logger = Logger('wings') - ..onRecord.listen((rec) { - print(rec); - if (rec.error != null) print(rec.error); - if (rec.stackTrace != null) print(rec.stackTrace); - }); + + app.logger = Logger('wings')..onRecord.listen(prettyLog); + app.mimeTypeResolver.addExtension('yaml', 'text/x-yaml'); app.get('/', (req, res) => 'WINGS!!!'); app.fallback(vDir.handleRequest); app.fallback((req, res) => throw AngelHttpException.notFound()); await wings.startServer('127.0.0.1', 3000); - print('Listening at http://localhost:3000'); + print('Listening at ${wings.uri}'); } diff --git a/example/pretty_log.dart b/example/pretty_log.dart new file mode 100644 index 00000000..079cf258 --- /dev/null +++ b/example/pretty_log.dart @@ -0,0 +1,35 @@ +import 'package:angel_http_exception/angel_http_exception.dart'; +import 'package:logging/logging.dart'; +import 'package:io/ansi.dart'; + +/// Prints the contents of a [LogRecord] with pretty colors. +void prettyLog(LogRecord record) { + var code = chooseLogColor(record.level); + + if (record.error == null) print(code.wrap(record.toString())); + + if (record.error != null) { + var err = record.error; + if (err is AngelHttpException && err.statusCode != 500) return; + print(code.wrap(record.toString() + '\n')); + print(code.wrap(err.toString())); + + if (record.stackTrace != null) { + print(code.wrap(record.stackTrace.toString())); + } + } +} + +/// Chooses a color based on the logger [level]. +AnsiCode chooseLogColor(Level level) { + if (level == Level.SHOUT) + return backgroundRed; + else if (level == Level.SEVERE) + return red; + else if (level == Level.WARNING) + return yellow; + else if (level == Level.INFO) + return cyan; + else if (level == Level.FINER || level == Level.FINEST) return lightGray; + return resetAll; +} \ No newline at end of file diff --git a/lib/src/libangel_wings.dylib b/lib/src/libangel_wings.dylib new file mode 100644 index 0000000000000000000000000000000000000000..58a946f4ae50d04f71a75153e34f0033cf7e0144 GIT binary patch literal 83512 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 z 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
  • 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 literal 0 HcmV?d00001 diff --git a/lib/src/wings_driver.dart b/lib/src/wings_driver.dart index bc4bff0e..feda34f2 100644 --- a/lib/src/wings_driver.dart +++ b/lib/src/wings_driver.dart @@ -31,14 +31,17 @@ class AngelWings extends Driver createRequestContext(WingsClientSocket request, int response) { + Future createRequestContext( + WingsClientSocket request, int response) { return WingsRequestContext.from(app, request); } @override - Future createResponseContext(WingsClientSocket request, int response, + Future createResponseContext( + WingsClientSocket request, int response, [WingsRequestContext correspondingRequest]) { - return Future.value(WingsResponseContext(request.fileDescriptor, correspondingRequest)); + return Future.value(WingsResponseContext( + app, request.fileDescriptor, correspondingRequest)); } @override @@ -68,8 +71,9 @@ class AngelWings extends Driver null; + Uri get uri { + return Uri(scheme: 'http', host: server.address.address, port: server.port); + } @override void writeStringToResponse(int response, String value) { diff --git a/lib/src/wings_request.dart b/lib/src/wings_request.dart index 6b97e8e6..83203f29 100644 --- a/lib/src/wings_request.dart +++ b/lib/src/wings_request.dart @@ -28,6 +28,11 @@ class WingsRequestContext extends RequestContext { WingsRequestContext._(this.app, this.rawRequest, this._recv) : container = app.container.createChild(); + Future close() async { + await _body.close(); + _recv.close(); + } + static const int DELETE = 0, GET = 1, HEAD = 2, @@ -106,18 +111,19 @@ class WingsRequestContext extends RequestContext { if (e == 0) { state = _ParseState.method; } else { - lastHeader = e as String; + lastHeader = e as String; //Uri.decodeFull(e as String); state = _ParseState.headerValue; } } else if (state == _ParseState.headerValue) { if (e == 0) { state = _ParseState.method; } else { + var value = e as String; //Uri.decodeFull(e as String); if (lastHeader != null) { if (lastHeader == 'cookie') { - rq.__cookies.add(Cookie.fromSetCookieValue(e as String)); + rq.__cookies.add(Cookie.fromSetCookieValue(value)); } else { - rq._headers.add(lastHeader, e as String); + rq._headers.add(lastHeader, value); } lastHeader = null; } diff --git a/lib/src/wings_response.dart b/lib/src/wings_response.dart index cbc00794..206ea4b9 100644 --- a/lib/src/wings_response.dart +++ b/lib/src/wings_response.dart @@ -8,6 +8,9 @@ import 'wings_request.dart'; import 'wings_socket.dart'; class WingsResponseContext extends ResponseContext { + @override + final Angel app; + @override final WingsRequestContext correspondingRequest; @@ -18,7 +21,7 @@ class WingsResponseContext extends ResponseContext { bool _isDetached = false, _isClosed = false, _streamInitialized = false; - WingsResponseContext(this.rawResponse, [this.correspondingRequest]); + WingsResponseContext(this.app, this.rawResponse, [this.correspondingRequest]); Iterable __allowedEncodings; @@ -78,8 +81,9 @@ class WingsResponseContext extends ResponseContext { } void _wh(String k, String v) { - var headerLine = - utf8.encode('$k: ${Uri.encodeComponent(v)}').followedBy([$cr, $lf]); + // var vv =Uri.encodeComponent(v); + var vv = v; + var headerLine = utf8.encode('$k: $vv').followedBy([$cr, $lf]); writeToNativeSocket( rawResponse, Uint8List.fromList(headerLine.toList())); } @@ -127,8 +131,9 @@ class WingsResponseContext extends ResponseContext { } return output.forEach((buf) { - writeToNativeSocket( - rawResponse, buf is Uint8List ? buf : Uint8List.fromList(buf)); + if (!_isClosed) + writeToNativeSocket( + rawResponse, buf is Uint8List ? buf : Uint8List.fromList(buf)); }); } @@ -168,27 +173,21 @@ class WingsResponseContext extends ResponseContext { } @override - Future close() { + Future close() async { if (!_isDetached) { if (!_isClosed) { + _isClosed = true; if (!isBuffered) { - try { - _openStream(); - closeNativeSocketDescriptor(rawResponse); - } catch (_) { - // This only seems to occur on `MockHttpRequest`, but - // this try/catch prevents a crash. - } + _openStream(); + closeNativeSocketDescriptor(rawResponse); } else { _buffer.lock(); } - - _isClosed = true; } - super.close(); + await correspondingRequest?.close(); + await super.close(); } - return new Future.value(); } @override diff --git a/lib/src/wings_socket.dart b/lib/src/wings_socket.dart index 8b875f43..3a9a3c38 100644 --- a/lib/src/wings_socket.dart +++ b/lib/src/wings_socket.dart @@ -44,6 +44,7 @@ class WingsClientSocket { class WingsSocket extends Stream { final StreamController _ctrl = StreamController(); SendPort _acceptor; + InternetAddress _address; final int _pointer; final RawReceivePort _recv; bool _open = true; @@ -91,13 +92,15 @@ class WingsSocket extends Stream { addr.address, port, shared, backlog, v6Only, recv.sendPort); } - return WingsSocket._(ptr, recv); + return WingsSocket._(ptr, recv).._address = addr; } catch (e) { recv.close(); rethrow; } } + InternetAddress get address => _address; + int get port => _port ??= getWingsServerSocketPort(_pointer); @override diff --git a/libangel_wings.dylib b/libangel_wings.dylib new file mode 100644 index 0000000000000000000000000000000000000000..58a946f4ae50d04f71a75153e34f0033cf7e0144 GIT binary patch literal 83512 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 z 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
  • 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 literal 0 HcmV?d00001 diff --git a/pubspec.yaml b/pubspec.yaml index e24d2504..1d825c84 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,4 +8,5 @@ dependencies: dev_dependencies: angel_static: ^2.0.0 build_runner: ^1.0.0 + io: ^0.3.2 pedantic: ^1.0.0 \ No newline at end of file