33// BSD-style license that can be found in the LICENSE file.
44
55import 'dart:async' ;
6+ import 'dart:convert' ;
67
8+ import 'package:_pub_shared/search/search_request_data.dart' ;
79import 'package:logging/logging.dart' ;
810import 'package:shelf/shelf.dart' as shelf;
11+ import 'package:shelf_router/shelf_router.dart' ;
912
1013import '../shared/env_config.dart' ;
1114import '../shared/handlers.dart' ;
@@ -18,28 +21,22 @@ final Duration _slowSearchThreshold = const Duration(milliseconds: 200);
1821
1922/// Handlers for the search service.
2023Future <shelf.Response > searchServiceHandler (shelf.Request request) async {
21- final path = request.requestedUri.path;
22- final handler = < String , shelf.Handler > {
23- '/debug' : _debugHandler,
24- '/liveness_check' : _livenessCheckHandler,
25- '/readiness_check' : _readinessCheckHandler,
26- '/search' : _searchHandler,
27- '/robots.txt' : rejectRobotsHandler,
28- }[path];
29-
30- if (handler != null ) {
31- return await handler (request);
32- } else {
33- return notFoundHandler (request);
34- }
24+ final router = Router (notFoundHandler: notFoundHandler)
25+ ..get ('/debug' , _debugHandler)
26+ ..get ('/liveness_check' , _livenessCheckHandler)
27+ ..get ('/readiness_check' , _readinessCheckHandler)
28+ ..get ('/search' , _searchHandler)
29+ ..post ('/search' , _searchHandler)
30+ ..get ('/robots.txt' , rejectRobotsHandler);
31+ return await router.call (request);
3532}
3633
37- /// Handles /liveness_check requests.
34+ /// Handles GET /liveness_check requests.
3835Future <shelf.Response > _livenessCheckHandler (shelf.Request request) async {
3936 return htmlResponse ('OK' );
4037}
4138
42- /// Handles /readiness_check requests.
39+ /// Handles GET /readiness_check requests.
4340Future <shelf.Response > _readinessCheckHandler (shelf.Request request) async {
4441 if (await searchIndex.isReady ()) {
4542 return htmlResponse ('OK' );
@@ -48,21 +45,28 @@ Future<shelf.Response> _readinessCheckHandler(shelf.Request request) async {
4845 }
4946}
5047
51- /// Handler /debug requests
48+ /// Handler GET /debug requests
5249Future <shelf.Response > _debugHandler (shelf.Request request) async {
5350 final info = await searchIndex.indexInfo ();
5451 return debugResponse (info.toJson ());
5552}
5653
57- /// Handles /search requests.
54+ /// Handles GET /search requests.
55+ /// Handles POST /search requests.
5856Future <shelf.Response > _searchHandler (shelf.Request request) async {
5957 final info = await searchIndex.indexInfo ();
6058 if (! info.isReady) {
6159 return htmlResponse (searchIndexNotReadyText,
6260 status: searchIndexNotReadyCode);
6361 }
6462 final Stopwatch sw = Stopwatch ()..start ();
65- final query = ServiceSearchQuery .fromServiceUrl (request.requestedUri);
63+ final query = request.method == 'POST'
64+ ? ServiceSearchQuery .fromSearchRequestData (
65+ SearchRequestData .fromJson (
66+ json.decode (await request.readAsString ()) as Map <String , dynamic >,
67+ ),
68+ )
69+ : ServiceSearchQuery .fromServiceUrl (request.requestedUri);
6670 final result = await searchIndex.search (query);
6771 final Duration elapsed = sw.elapsed;
6872 if (elapsed > _slowSearchThreshold) {
0 commit comments