This commit is contained in:
thosakwe 2017-02-26 16:31:09 -05:00
parent 7586b4c58e
commit 6da3be08fd
7 changed files with 86 additions and 30 deletions

View file

@ -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.

View file

@ -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 {

View file

@ -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;

View file

@ -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);

View file

@ -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<Controller>.broadcast();
final List<Angel> _children = [];
Angel _parent;
final Random _rand = new Random.secure();
ServerGenerator _serverGenerator = HttpServer.bind;
final Map<dynamic, InjectionRequest> _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);
}
}

View file

@ -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 <thosakwe@gmail.com>
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

44
test/serialize_test.dart Normal file
View file

@ -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));
});
}