From 6da3be08fdcbb39c72c009e704cbb061630e6516 Mon Sep 17 00:00:00 2001 From: thosakwe Date: Sun, 26 Feb 2017 16:31:09 -0500 Subject: [PATCH] 60 --- README.md | 2 +- lib/src/http/controller.dart | 2 ++ lib/src/http/hooked_service.dart | 5 +++ lib/src/http/request_context.dart | 2 ++ lib/src/http/server.dart | 58 ++++++++++++++++--------------- pubspec.yaml | 3 +- test/serialize_test.dart | 44 +++++++++++++++++++++++ 7 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 test/serialize_test.dart diff --git a/README.md b/README.md index 3ae84724..2bf9a154 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # angel_framework -[![pub 1.0.0-dev.59](https://img.shields.io/badge/pub-1.0.0--dev.59-red.svg)](https://pub.dartlang.org/packages/angel_framework) +[![pub 1.0.0-dev.60](https://img.shields.io/badge/pub-1.0.0--dev.60-red.svg)](https://pub.dartlang.org/packages/angel_framework) [![build status](https://travis-ci.org/angel-dart/framework.svg)](https://travis-ci.org/angel-dart/framework) Core libraries for the Angel Framework. diff --git a/lib/src/http/controller.dart b/lib/src/http/controller.dart index bde968f9..044960ad 100644 --- a/lib/src/http/controller.dart +++ b/lib/src/http/controller.dart @@ -148,6 +148,8 @@ RequestHandler handleContained(handler, InjectionRequest injection) { args.add(req.params[requirement]); } else if (req.injections.containsKey(requirement)) args.add(req.injections[requirement]); + else if (req.properties.containsKey(requirement)) + args.add(req.properties[requirement]); else if (injection.optional.contains(requirement)) args.add(null); else { diff --git a/lib/src/http/hooked_service.dart b/lib/src/http/hooked_service.dart index ae3cbc18..5e4b5e7a 100644 --- a/lib/src/http/hooked_service.dart +++ b/lib/src/http/hooked_service.dart @@ -521,6 +521,11 @@ class HookedServiceEvent { this.result = result ?? this.result; } + /// Resolves a service from the application. + /// + /// Shorthand for `e.service.app.service(...)`. + Service getService(Pattern path) => service.app.service(path); + bool _canceled = false; String _eventName; var _id; diff --git a/lib/src/http/request_context.dart b/lib/src/http/request_context.dart index 23dc7284..565473ed 100644 --- a/lib/src/http/request_context.dart +++ b/lib/src/http/request_context.dart @@ -108,6 +108,8 @@ class RequestContext extends Extensible { return params[key]; else if (injections.containsKey(key)) return injections[key]; + else if (properties.containsKey(key)) + return properties[key]; else if (key is Type) { try { return app.container.make(key); diff --git a/lib/src/http/server.dart b/lib/src/http/server.dart index 014c443b..e61995b0 100644 --- a/lib/src/http/server.dart +++ b/lib/src/http/server.dart @@ -2,7 +2,6 @@ library angel_framework.http.server; import 'dart:async'; import 'dart:io'; -import 'dart:math' show Random; import 'dart:mirrors'; import 'package:angel_route/angel_route.dart'; import 'angel_base.dart'; @@ -39,7 +38,6 @@ class Angel extends AngelBase { new StreamController.broadcast(); final List _children = []; Angel _parent; - final Random _rand = new Random.secure(); ServerGenerator _serverGenerator = HttpServer.bind; final Map _preContained = {}; @@ -117,14 +115,6 @@ class Angel extends AngelBase { if (debug) print(x); } - String _randomString(int length) { - var codeUnits = new List.generate(length, (index) { - return _rand.nextInt(33) + 89; - }); - - return new String.fromCharCodes(codeUnits); - } - /// Starts the server. /// /// Returns false on failure; otherwise, returns the HttpServer. @@ -156,7 +146,9 @@ class Angel extends AngelBase { else if (result is RequestHandler) return await executeHandler(result, req, res); else if (result != null) { - res.serialize(result); + res.serialize(result, + contentType: res.headers[HttpHeaders.CONTENT_TYPE] ?? + ContentType.JSON.mimeType); return false; } else return res.isOpen; @@ -176,7 +168,9 @@ class Angel extends AngelBase { else if (result is RequestHandler) return await executeHandler(result, req, res); else if (result != null) { - res.serialize(result); + res.serialize(result, + contentType: res.headers[HttpHeaders.CONTENT_TYPE] ?? + ContentType.JSON.mimeType); return false; } else return true; @@ -189,7 +183,9 @@ class Angel extends AngelBase { else if (result is RequestHandler) return await executeHandler(result, req, res); else if (result != null) { - res.serialize(result); + res.serialize(result, + contentType: res.headers[HttpHeaders.CONTENT_TYPE] ?? + ContentType.JSON.mimeType); return false; } else return true; @@ -199,7 +195,9 @@ class Angel extends AngelBase { return await executeHandler(requestMiddleware[handler], req, res); } - res.serialize(handler); + res.serialize(handler, + contentType: + res.headers[HttpHeaders.CONTENT_TYPE] ?? ContentType.JSON.mimeType); return false; } @@ -460,6 +458,17 @@ class Angel extends AngelBase { factory Angel.custom(ServerGenerator serverGenerator, {bool debug: false}) => new Angel(debug: debug == true).._serverGenerator = serverGenerator; + factory Angel.fromSecurityContext(SecurityContext context, + {bool debug: false}) { + var app = new Angel(debug: debug == true); + + app._serverGenerator = (InternetAddress address, int port) async { + return await HttpServer.bindSecure(address, port, context); + }; + + return app; + } + /// Creates an HTTPS server. /// /// Provide paths to a certificate chain and server key (both .pem). @@ -467,21 +476,14 @@ class Angel extends AngelBase { /// the server. factory Angel.secure(String certificateChainPath, String serverKeyPath, {bool debug: false, String password}) { - var app = new Angel(debug: debug == true); + var certificateChain = + Platform.script.resolve(certificateChainPath).toFilePath(); + var serverKey = Platform.script.resolve(serverKeyPath).toFilePath(); + var serverContext = new SecurityContext(); + serverContext.useCertificateChain(certificateChain); + serverContext.usePrivateKey(serverKey, password: password); - app._serverGenerator = (InternetAddress address, int port) async { - var certificateChain = - Platform.script.resolve(certificateChainPath).toFilePath(); - var serverKey = Platform.script.resolve(serverKeyPath).toFilePath(); - var serverContext = new SecurityContext(); - serverContext.useCertificateChain(certificateChain); - serverContext.usePrivateKey(serverKey, - password: password ?? app._randomString(8)); - - return await HttpServer.bindSecure(address, port, serverContext); - }; - - return app; + return new Angel.fromSecurityContext(serverContext); } } diff --git a/pubspec.yaml b/pubspec.yaml index 15af350d..3b11f006 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_framework -version: 1.0.0-dev.59 +version: 1.0.0-dev.60 description: Core libraries for the Angel framework. author: Tobe O homepage: https://github.com/angel-dart/angel_framework @@ -11,6 +11,7 @@ dependencies: container: ^0.1.2 json_god: ^2.0.0-beta merge_map: ^1.0.0 + random_string: ^0.0.1 mime: ^0.9.3 dev_dependencies: http: ^0.11.3 diff --git a/test/serialize_test.dart b/test/serialize_test.dart new file mode 100644 index 00000000..d52850b0 --- /dev/null +++ b/test/serialize_test.dart @@ -0,0 +1,44 @@ +import 'dart:io'; +import 'package:angel_framework/angel_framework.dart'; +import 'package:http/http.dart' as http; +import 'package:test/test.dart'; + +main() { + Angel app; + http.Client client; + HttpServer server; + String url; + + setUp(() async { + app = new Angel() + ..get('/foo', () => {'hello': 'world'}) + ..get( + '/bar', + (req, ResponseContext res) => + res.serialize({'hello': 'world'}, contentType: ContentType.HTML)); + client = new http.Client(); + + server = await app.startServer(); + url = "http://${server.address.host}:${server.port}"; + }); + + tearDown(() async { + app = null; + url = null; + client.close(); + client = null; + await server.close(force: true); + }); + + test("correct content-type", () async { + var response = await client.get('$url/foo'); + print('Response: ${response.body}'); + expect(response.headers[HttpHeaders.CONTENT_TYPE], + contains(ContentType.JSON.mimeType)); + + response = await client.get('$url/bar'); + print('Response: ${response.body}'); + expect(response.headers[HttpHeaders.CONTENT_TYPE], + contains(ContentType.HTML.mimeType)); + }); +}