platform/packages/shelf/lib/src/shelf_request.dart

78 lines
1.8 KiB
Dart
Raw Normal View History

2019-10-14 15:28:50 +00:00
import 'dart:async';
import 'dart:io';
import 'package:angel_container/angel_container.dart';
import 'package:angel_framework/angel_framework.dart';
import 'package:mock_request/mock_request.dart';
import 'package:shelf/shelf.dart' as shelf;
class ShelfRequestContext extends RequestContext {
@override
final Angel app;
@override
final Container container;
@override
final shelf.Request rawRequest;
@override
final String path;
2021-06-20 12:37:20 +00:00
List<Cookie>? _cookies;
2019-10-14 15:28:50 +00:00
@override
final MockHttpHeaders headers = MockHttpHeaders();
ShelfRequestContext(this.app, this.container, this.rawRequest, this.path) {
rawRequest.headers.forEach(headers.add);
}
@override
Stream<List<int>> get body => rawRequest.read();
@override
List<Cookie> get cookies {
if (_cookies == null) {
// Parse cookies
_cookies = [];
var value = headers.value('cookie');
if (value != null) {
var cookieStrings = value.split(';').map((s) => s.trim());
for (var cookieString in cookieStrings) {
try {
2021-06-20 12:37:20 +00:00
_cookies!.add(Cookie.fromSetCookieValue(cookieString));
2019-10-14 15:28:50 +00:00
} catch (_) {
// Ignore malformed cookies, and just don't add them to the container.
}
}
}
}
2021-06-20 12:37:20 +00:00
return _cookies!;
2019-10-14 15:28:50 +00:00
}
@override
2021-06-20 12:37:20 +00:00
String get hostname => rawRequest.headers['host']!;
2019-10-14 15:28:50 +00:00
@override
String get method {
if (!app.allowMethodOverrides) {
return originalMethod;
} else {
return headers.value('x-http-method-override')?.toUpperCase() ??
originalMethod;
}
}
@override
String get originalMethod => rawRequest.method;
@override
// TODO: implement remoteAddress
2021-06-20 12:37:20 +00:00
InternetAddress get remoteAddress => InternetAddress.loopbackIPv4;
2019-10-14 15:28:50 +00:00
@override
// TODO: implement session
2021-06-20 12:37:20 +00:00
HttpSession? get session => null;
2019-10-14 15:28:50 +00:00
@override
Uri get uri => rawRequest.url;
}