blob: 8d2499d39d7a2a59f531783a3d1784cd8ffe0961 [file] [log] [blame]
// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:shelf/shelf.dart';
import '../service/config.dart';
import '../requests/exceptions.dart';
@immutable
abstract class RequestHandler {
const RequestHandler({
required this.config,
});
final Config config;
/// Services a request.
///
/// The default implementation will respond with 405 method not allowed.
@protected
Future<Response> run(Request request) async {
try {
switch (request.method) {
case 'GET':
return await get() as Response;
case 'POST':
return await post(request) as Response;
default:
throw MethodNotAllowed(request.method);
}
} on HttpStatusException {
rethrow;
}
}
/// Services a GET request.
///
/// Subclasses should override this method if they support GET requests.
/// The default implementation will respond with 405 method not allowed.
@protected
Future get() async {
throw const MethodNotAllowed('GET');
}
/// Services a POST request.
///
/// Subclasses should override this method if they support POST requests.
/// The default implementation will respond with 405 method not allowed.
@protected
Future post(Request request) async {
throw const MethodNotAllowed('POST');
}
}