diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f148a10..775285b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,117 +1,134 @@ +# 2.0.0-alpha.12 + +- Remove `ResponseContext.sendFile`. +- Add `Angel.mimeTypeResolver`. +- Fix a bug where an unknown MIME type on `streamFile` would return a 500. + # 2.0.0-alpha.11 -* Add `readMany` to `Service`. -* Allow `ResponseContext.redirect` to take a `Uri`. -* Add `Angel.mountController`. -* Add `Angel.findServiceOf`. -* Roll in HTTP/2. See `pkg:angel_framework/http2.dart`. + +- Add `readMany` to `Service`. +- Allow `ResponseContext.redirect` to take a `Uri`. +- Add `Angel.mountController`. +- Add `Angel.findServiceOf`. +- Roll in HTTP/2. See `pkg:angel_framework/http2.dart`. # 2.0.0-alpha.10 -* All calls to `Service.parseId` are now affixed with the `` argument. -* Added `uri` getter to `AngelHttp`. -* The default for `parseQuery` now wraps query parameters in `new Map.from`. -This resolves a bug in `package:angel_validate`. + +- All calls to `Service.parseId` are now affixed with the `` argument. +- Added `uri` getter to `AngelHttp`. +- The default for `parseQuery` now wraps query parameters in `new Map.from`. + This resolves a bug in `package:angel_validate`. # 2.0.0-alpha.9 -* Add `Service.map`. + +- Add `Service.map`. # 2.0.0-alpha.8 -* No longer export HTTP-specific code from `angel_framework.dart`. -An import of `import 'package:angel_framework/http.dart';` will be necessary in most cases now. + +- No longer export HTTP-specific code from `angel_framework.dart`. + An import of `import 'package:angel_framework/http.dart';` will be necessary in most cases now. # 2.0.0-alpha.7 -* Force a tigher contract on services. They now must return `Data` on all -methods except for `index`, which returns a `List`. + +- Force a tigher contract on services. They now must return `Data` on all + methods except for `index`, which returns a `List`. # 2.0.0-alpha.6 -* Allow passing a custom `Container` to `handleContained` and co. + +- Allow passing a custom `Container` to `handleContained` and co. # 2.0.0-alpha.5 -* `MapService` methods now explicitly return `Map`. + +- `MapService` methods now explicitly return `Map`. # 2.0.0-alpha.4 -* Renamed `waterfall` to `chain`. -* Renamed `Routable.service` to `Routable.findService`. - * Also `Routable.findHookedService`. + +- Renamed `waterfall` to `chain`. +- Renamed `Routable.service` to `Routable.findService`. + - Also `Routable.findHookedService`. # 2.0.0-alpha.3 -* Added `` type parameters to `Service`. -* `HookedService` now follows suit, and takes a third parameter, pointing to the inner service. -* `Routable.use` now uses the generic parameters added to `Service`. -* Added generic usage to `HookedServiceListener`, etc. -* All service methods take `Map` as `params` now. + +- Added `` type parameters to `Service`. +- `HookedService` now follows suit, and takes a third parameter, pointing to the inner service. +- `Routable.use` now uses the generic parameters added to `Service`. +- Added generic usage to `HookedServiceListener`, etc. +- All service methods take `Map` as `params` now. # 2.0.0-alpha.2 -* Added `ResponseContext.detach`. + +- Added `ResponseContext.detach`. # 2.0.0-alpha.1 -* Removed `Angel.injectEncoders`. -* Added `Providers.toJson`. -* Moved `Providers.graphql` to `Providers.graphQL`. -* `Angel.optimizeForProduction` no longer calls `preInject`, -as it does not need to. -* Rename `ResponseContext.enableBuffer` to `ResponseContext.useBuffer`. + +- Removed `Angel.injectEncoders`. +- Added `Providers.toJson`. +- Moved `Providers.graphql` to `Providers.graphQL`. +- `Angel.optimizeForProduction` no longer calls `preInject`, + as it does not need to. +- Rename `ResponseContext.enableBuffer` to `ResponseContext.useBuffer`. # 2.0.0-alpha -* Removed `random_string` dependency. -* Moved reflection to `package:angel_container`. -* Upgraded `package:file` to `5.0.0`. -* `ResponseContext.sendFile` now uses `package:file`. -* Abandon `ContentType` in favor of `MediaType`. -* Changed view engine to use `Map`. -* Remove dependency on `package:json_god` by default. -* Remove dependency on `package:dart2_constant`. -* Moved `lib/hooks.dart` into `package:angel_hooks`. -* Moved `TypedService` into `package:angel_typed_service`. -* Completely removed the `AngelBase` class. -* Removed all `@deprecated` symbols. -* `Service.toId` was renamed to `Service.parseId`; it also now uses its -single type argument to determine how to parse a value. - * In addition, this method was also made `static`. -* `RequestContext` and `ResponseContext` are now generic, and take a -single type argument pointing to the underlying request/response type, -respectively. -* `RequestContext.io` and `ResponseContext.io` are now permanently -gone. -* `HttpRequestContextImpl` and `HttpResponseContextImpl` were renamed to -`HttpRequestContext` and `HttpResponseContext`. -* Lazy-parsing request bodies is now the default; `Angel.lazyParseBodies` was replaced -with `Angel.eagerParseRequestBodies`. -* `Angel.storeOriginalBuffer` -> `Angel.storeRawRequestBuffers`. -* The methods `lazyBody`, `lazyFiles`, and `lazyOriginalBuffer` on `ResponseContext` were all -replaced with `parseBody`, `parseUploadedFiles`, and `parseRawRequestBuffer`, respectively. -* Removed the synchronous equivalents of the above methods (`body`, `files`, and `originalBuffer`), -as well as `query`. -* Removed `Angel.injections` and `RequestContext.injections`. -* Removed `Angel.inject` and `RequestContext.inject`. -* Removed a dependency on `package:pool`, which also meant removing `AngelHttp.throttle`. -* Remove the `RequestMiddleware` typedef; from now on, one should use `ResponseContext.end` -exclusively to close responses. -* `waterfall` will now only accept `RequestHandler`. -* `Routable`, and all of its subclasses, now extend `Router`, and therefore only -take routes in the form of `FutureOr myFunc(RequestContext, ResponseContext res)`. -* `@Middleware` now takes an `Iterable` of `RequestHandler`s. -* `@Expose.path` now *must* be a `String`, not just any `Pattern`. -* `@Expose.middleware` now takes `Iterable`, instead of just `List`. -* `createDynamicHandler` was renamed to `ioc`, and is now used to run IoC-aware handlers in a -type-safe manner. -* `RequestContext.params` is now a `Map`, rather than just a `Map`. -* Removed `RequestContext.grab`. -* Removed `RequestContext.properties`. -* Removed the defunct `debug` property where it still existed. -* `Routable.use` now only accepts a `Service`. -* Removed `Angel.createZoneForRequest`. -* Removed `Angel.defaultZoneCreator`. -* Added all flags to the `Angel` constructor, ex. `Angel.eagerParseBodies`. -* Fix a bug where synchronous errors in `handleRequest` would not be caught. -* `AngelHttp.useZone` now defaults to `false`. -* `ResponseContext` now starts in streaming mode by default; the response buffer is opt-in, -as in many cases it is unnecessary and slows down response time. -* `ResponseContext.streaming` was replaced by `ResponseContext.isBuffered`. -* Made `LockableBytesBuilder` public. -* Removed the now-obsolete `ResponseContext.willCloseItself`. -* Removed `ResponseContext.dispose`. -* Removed the now-obsolete `ResponseContext.end`. -* Removed the now-obsolete `ResponseContext.releaseCorrespondingRequest`. -* `preInject` now takes a `Reflector` as its second argument. -* `Angel.reflector` defaults to `const EmptyReflector()`, disabling -reflection out-of-the-box. \ No newline at end of file + +- Removed `random_string` dependency. +- Moved reflection to `package:angel_container`. +- Upgraded `package:file` to `5.0.0`. +- `ResponseContext.sendFile` now uses `package:file`. +- Abandon `ContentType` in favor of `MediaType`. +- Changed view engine to use `Map`. +- Remove dependency on `package:json_god` by default. +- Remove dependency on `package:dart2_constant`. +- Moved `lib/hooks.dart` into `package:angel_hooks`. +- Moved `TypedService` into `package:angel_typed_service`. +- Completely removed the `AngelBase` class. +- Removed all `@deprecated` symbols. +- `Service.toId` was renamed to `Service.parseId`; it also now uses its + single type argument to determine how to parse a value. \* In addition, this method was also made `static`. +- `RequestContext` and `ResponseContext` are now generic, and take a + single type argument pointing to the underlying request/response type, + respectively. +- `RequestContext.io` and `ResponseContext.io` are now permanently + gone. +- `HttpRequestContextImpl` and `HttpResponseContextImpl` were renamed to + `HttpRequestContext` and `HttpResponseContext`. +- Lazy-parsing request bodies is now the default; `Angel.lazyParseBodies` was replaced + with `Angel.eagerParseRequestBodies`. +- `Angel.storeOriginalBuffer` -> `Angel.storeRawRequestBuffers`. +- The methods `lazyBody`, `lazyFiles`, and `lazyOriginalBuffer` on `ResponseContext` were all + replaced with `parseBody`, `parseUploadedFiles`, and `parseRawRequestBuffer`, respectively. +- Removed the synchronous equivalents of the above methods (`body`, `files`, and `originalBuffer`), + as well as `query`. +- Removed `Angel.injections` and `RequestContext.injections`. +- Removed `Angel.inject` and `RequestContext.inject`. +- Removed a dependency on `package:pool`, which also meant removing `AngelHttp.throttle`. +- Remove the `RequestMiddleware` typedef; from now on, one should use `ResponseContext.end` + exclusively to close responses. +- `waterfall` will now only accept `RequestHandler`. +- `Routable`, and all of its subclasses, now extend `Router`, and therefore only + take routes in the form of `FutureOr myFunc(RequestContext, ResponseContext res)`. +- `@Middleware` now takes an `Iterable` of `RequestHandler`s. +- `@Expose.path` now _must_ be a `String`, not just any `Pattern`. +- `@Expose.middleware` now takes `Iterable`, instead of just `List`. +- `createDynamicHandler` was renamed to `ioc`, and is now used to run IoC-aware handlers in a + type-safe manner. +- `RequestContext.params` is now a `Map`, rather than just a `Map`. +- Removed `RequestContext.grab`. +- Removed `RequestContext.properties`. +- Removed the defunct `debug` property where it still existed. +- `Routable.use` now only accepts a `Service`. +- Removed `Angel.createZoneForRequest`. +- Removed `Angel.defaultZoneCreator`. +- Added all flags to the `Angel` constructor, ex. `Angel.eagerParseBodies`. +- Fix a bug where synchronous errors in `handleRequest` would not be caught. +- `AngelHttp.useZone` now defaults to `false`. +- `ResponseContext` now starts in streaming mode by default; the response buffer is opt-in, + as in many cases it is unnecessary and slows down response time. +- `ResponseContext.streaming` was replaced by `ResponseContext.isBuffered`. +- Made `LockableBytesBuilder` public. +- Removed the now-obsolete `ResponseContext.willCloseItself`. +- Removed `ResponseContext.dispose`. +- Removed the now-obsolete `ResponseContext.end`. +- Removed the now-obsolete `ResponseContext.releaseCorrespondingRequest`. +- `preInject` now takes a `Reflector` as its second argument. +- `Angel.reflector` defaults to `const EmptyReflector()`, disabling + reflection out-of-the-box. diff --git a/lib/src/core/response_context.dart b/lib/src/core/response_context.dart index 8ad806f3..9a858717 100644 --- a/lib/src/core/response_context.dart +++ b/lib/src/core/response_context.dart @@ -276,15 +276,6 @@ abstract class ResponseContext redirect('$head/$tail'.replaceAll(_straySlashes, ''), code: code); } - /// Copies a file's contents into the response buffer. - void sendFile(File file) { - if (!isOpen) throw closed(); - - contentType = MediaType.parse(lookupMimeType(file.path)); - buffer.add(file.readAsBytesSync()); - close(); - } - /// Serializes data to the response. bool serialize(value, {MediaType contentType}) { if (!isOpen) throw closed(); @@ -299,7 +290,10 @@ abstract class ResponseContext /// Streams a file to this response. Future streamFile(File file) { if (!isOpen) throw closed(); - contentType = MediaType.parse(lookupMimeType(file.path)); + var mimeType = app.mimeTypeResolver.lookup(file.path); + contentType = mimeType == null + ? new MediaType('application', 'octet-stream') + : MediaType.parse(mimeType); return file.openRead().pipe(this); } diff --git a/lib/src/core/server.dart b/lib/src/core/server.dart index 39ab2024..0dd00111 100644 --- a/lib/src/core/server.dart +++ b/lib/src/core/server.dart @@ -11,6 +11,7 @@ import 'package:angel_route/angel_route.dart'; import 'package:combinator/combinator.dart'; import 'package:http_parser/http_parser.dart'; import 'package:logging/logging.dart'; +import 'package:mime/mime.dart'; import 'package:tuple/tuple.dart'; import 'controller.dart'; @@ -48,6 +49,9 @@ class Angel extends Routable { final Map _preContained = {}; + /// A [MimeTypeResolver] that can be used to specify the MIME types of files not known by `package:mime`. + final MimeTypeResolver mimeTypeResolver = new MimeTypeResolver(); + /// A middleware to inject a serialize on every request. String Function(dynamic) serializer; diff --git a/pubspec.yaml b/pubspec.yaml index a8816027..7ea4473e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_framework -version: 2.0.0-alpha.11 +version: 2.0.0-alpha.12 description: A high-powered HTTP server with dependency injection, routing and much more. author: Tobe O homepage: https://github.com/angel-dart/angel_framework