60
This commit is contained in:
parent
7586b4c58e
commit
6da3be08fd
7 changed files with 86 additions and 30 deletions
|
@ -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.
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
44
test/serialize_test.dart
Normal 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));
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue