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
|
# angel_framework
|
||||||
|
|
||||||
[](https://pub.dartlang.org/packages/angel_framework)
|
[](https://pub.dartlang.org/packages/angel_framework)
|
||||||
[](https://travis-ci.org/angel-dart/framework)
|
[](https://travis-ci.org/angel-dart/framework)
|
||||||
|
|
||||||
Core libraries for the Angel Framework.
|
Core libraries for the Angel Framework.
|
||||||
|
|
|
@ -148,6 +148,8 @@ RequestHandler handleContained(handler, InjectionRequest injection) {
|
||||||
args.add(req.params[requirement]);
|
args.add(req.params[requirement]);
|
||||||
} else if (req.injections.containsKey(requirement))
|
} else if (req.injections.containsKey(requirement))
|
||||||
args.add(req.injections[requirement]);
|
args.add(req.injections[requirement]);
|
||||||
|
else if (req.properties.containsKey(requirement))
|
||||||
|
args.add(req.properties[requirement]);
|
||||||
else if (injection.optional.contains(requirement))
|
else if (injection.optional.contains(requirement))
|
||||||
args.add(null);
|
args.add(null);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -521,6 +521,11 @@ class HookedServiceEvent {
|
||||||
this.result = result ?? this.result;
|
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;
|
bool _canceled = false;
|
||||||
String _eventName;
|
String _eventName;
|
||||||
var _id;
|
var _id;
|
||||||
|
|
|
@ -108,6 +108,8 @@ class RequestContext extends Extensible {
|
||||||
return params[key];
|
return params[key];
|
||||||
else if (injections.containsKey(key))
|
else if (injections.containsKey(key))
|
||||||
return injections[key];
|
return injections[key];
|
||||||
|
else if (properties.containsKey(key))
|
||||||
|
return properties[key];
|
||||||
else if (key is Type) {
|
else if (key is Type) {
|
||||||
try {
|
try {
|
||||||
return app.container.make(key);
|
return app.container.make(key);
|
||||||
|
|
|
@ -2,7 +2,6 @@ library angel_framework.http.server;
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math' show Random;
|
|
||||||
import 'dart:mirrors';
|
import 'dart:mirrors';
|
||||||
import 'package:angel_route/angel_route.dart';
|
import 'package:angel_route/angel_route.dart';
|
||||||
import 'angel_base.dart';
|
import 'angel_base.dart';
|
||||||
|
@ -39,7 +38,6 @@ class Angel extends AngelBase {
|
||||||
new StreamController<Controller>.broadcast();
|
new StreamController<Controller>.broadcast();
|
||||||
final List<Angel> _children = [];
|
final List<Angel> _children = [];
|
||||||
Angel _parent;
|
Angel _parent;
|
||||||
final Random _rand = new Random.secure();
|
|
||||||
ServerGenerator _serverGenerator = HttpServer.bind;
|
ServerGenerator _serverGenerator = HttpServer.bind;
|
||||||
|
|
||||||
final Map<dynamic, InjectionRequest> _preContained = {};
|
final Map<dynamic, InjectionRequest> _preContained = {};
|
||||||
|
@ -117,14 +115,6 @@ class Angel extends AngelBase {
|
||||||
if (debug) print(x);
|
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.
|
/// Starts the server.
|
||||||
///
|
///
|
||||||
/// Returns false on failure; otherwise, returns the HttpServer.
|
/// Returns false on failure; otherwise, returns the HttpServer.
|
||||||
|
@ -156,7 +146,9 @@ class Angel extends AngelBase {
|
||||||
else if (result is RequestHandler)
|
else if (result is RequestHandler)
|
||||||
return await executeHandler(result, req, res);
|
return await executeHandler(result, req, res);
|
||||||
else if (result != null) {
|
else if (result != null) {
|
||||||
res.serialize(result);
|
res.serialize(result,
|
||||||
|
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
|
||||||
|
ContentType.JSON.mimeType);
|
||||||
return false;
|
return false;
|
||||||
} else
|
} else
|
||||||
return res.isOpen;
|
return res.isOpen;
|
||||||
|
@ -176,7 +168,9 @@ class Angel extends AngelBase {
|
||||||
else if (result is RequestHandler)
|
else if (result is RequestHandler)
|
||||||
return await executeHandler(result, req, res);
|
return await executeHandler(result, req, res);
|
||||||
else if (result != null) {
|
else if (result != null) {
|
||||||
res.serialize(result);
|
res.serialize(result,
|
||||||
|
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
|
||||||
|
ContentType.JSON.mimeType);
|
||||||
return false;
|
return false;
|
||||||
} else
|
} else
|
||||||
return true;
|
return true;
|
||||||
|
@ -189,7 +183,9 @@ class Angel extends AngelBase {
|
||||||
else if (result is RequestHandler)
|
else if (result is RequestHandler)
|
||||||
return await executeHandler(result, req, res);
|
return await executeHandler(result, req, res);
|
||||||
else if (result != null) {
|
else if (result != null) {
|
||||||
res.serialize(result);
|
res.serialize(result,
|
||||||
|
contentType: res.headers[HttpHeaders.CONTENT_TYPE] ??
|
||||||
|
ContentType.JSON.mimeType);
|
||||||
return false;
|
return false;
|
||||||
} else
|
} else
|
||||||
return true;
|
return true;
|
||||||
|
@ -199,7 +195,9 @@ class Angel extends AngelBase {
|
||||||
return await executeHandler(requestMiddleware[handler], req, res);
|
return await executeHandler(requestMiddleware[handler], req, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
res.serialize(handler);
|
res.serialize(handler,
|
||||||
|
contentType:
|
||||||
|
res.headers[HttpHeaders.CONTENT_TYPE] ?? ContentType.JSON.mimeType);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,6 +458,17 @@ class Angel extends AngelBase {
|
||||||
factory Angel.custom(ServerGenerator serverGenerator, {bool debug: false}) =>
|
factory Angel.custom(ServerGenerator serverGenerator, {bool debug: false}) =>
|
||||||
new Angel(debug: debug == true).._serverGenerator = serverGenerator;
|
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.
|
/// Creates an HTTPS server.
|
||||||
///
|
///
|
||||||
/// Provide paths to a certificate chain and server key (both .pem).
|
/// Provide paths to a certificate chain and server key (both .pem).
|
||||||
|
@ -467,21 +476,14 @@ class Angel extends AngelBase {
|
||||||
/// the server.
|
/// the server.
|
||||||
factory Angel.secure(String certificateChainPath, String serverKeyPath,
|
factory Angel.secure(String certificateChainPath, String serverKeyPath,
|
||||||
{bool debug: false, String password}) {
|
{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 {
|
return new Angel.fromSecurityContext(serverContext);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel_framework
|
name: angel_framework
|
||||||
version: 1.0.0-dev.59
|
version: 1.0.0-dev.60
|
||||||
description: Core libraries for the Angel framework.
|
description: Core libraries for the Angel framework.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/angel_framework
|
homepage: https://github.com/angel-dart/angel_framework
|
||||||
|
@ -11,6 +11,7 @@ dependencies:
|
||||||
container: ^0.1.2
|
container: ^0.1.2
|
||||||
json_god: ^2.0.0-beta
|
json_god: ^2.0.0-beta
|
||||||
merge_map: ^1.0.0
|
merge_map: ^1.0.0
|
||||||
|
random_string: ^0.0.1
|
||||||
mime: ^0.9.3
|
mime: ^0.9.3
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
http: ^0.11.3
|
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