Skip to content

Commit 604b206

Browse files
authored
Serve /documentation URLs through default service (frontend). (#1551)
* Serve /documentation URLs through default service (frontend). * Update dispatch.yaml
1 parent ee18e80 commit 604b206

File tree

7 files changed

+84
-12
lines changed

7 files changed

+84
-12
lines changed

app/bin/service/frontend.dart

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:logging/logging.dart';
1313
import 'package:pub_server/shelf_pubserver.dart';
1414
import 'package:shelf/shelf.dart' as shelf;
1515

16+
import 'package:pub_dartlang_org/dartdoc/backend.dart';
1617
import 'package:pub_dartlang_org/history/backend.dart';
1718
import 'package:pub_dartlang_org/history/models.dart';
1819
import 'package:pub_dartlang_org/job/backend.dart';
@@ -69,6 +70,10 @@ Future<shelf.Handler> setupServices(Configuration configuration) async {
6970
registerAnalyzerClient(analyzerClient);
7071
registerScopeExitCallback(analyzerClient.close);
7172

73+
final Bucket dartdocBucket = await getOrCreateBucket(
74+
storageService, activeConfiguration.dartdocStorageBucketName);
75+
registerDartdocBackend(new DartdocBackend(db.dbService, dartdocBucket));
76+
7277
registerDartdocMemcache(new DartdocMemcache(memcacheService));
7378
final dartdocClient = new DartdocClient();
7479
registerDartdocClient(dartdocClient);

app/lib/dartdoc/handlers.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Future<shelf.Response> dartdocServiceHandler(shelf.Request request) async {
3131
if (handler != null) {
3232
return await handler(request);
3333
} else if (path.startsWith('/documentation')) {
34-
return _documentationHandler(request);
34+
return documentationHandler(request);
3535
} else if (path == '/robots.txt' && !isProductionHost(request)) {
3636
return rejectRobotsHandler(request);
3737
} else if (path == '/robots.txt') {
@@ -56,7 +56,7 @@ Future<shelf.Response> _robotsTxtHandler(shelf.Request request) async {
5656

5757
/// Handles requests for:
5858
/// - /documentation/<package>/<version>
59-
Future<shelf.Response> _documentationHandler(shelf.Request request) async {
59+
Future<shelf.Response> documentationHandler(shelf.Request request) async {
6060
final docFilePath = parseRequestUri(request.requestedUri);
6161
if (docFilePath == null) {
6262
return _indexHandler(request);

app/lib/frontend/handlers.dart

+10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:logging/logging.dart';
1313
import 'package:path/path.dart' as path;
1414
import 'package:shelf/shelf.dart' as shelf;
1515

16+
import '../dartdoc/handlers.dart' show documentationHandler;
1617
import '../history/backend.dart';
1718
import '../shared/analyzer_client.dart';
1819
import '../shared/dartdoc_client.dart';
@@ -59,6 +60,12 @@ Future<shelf.Response> appHandler(
5960

6061
_logPubHeaders(request);
6162

63+
final host = request.requestedUri.host;
64+
if (host == 'www.dartdocs.org' || host == 'dartdocs.org') {
65+
return redirectResponse(
66+
request.requestedUri.replace(host: 'pub.dartlang.org').toString());
67+
}
68+
6269
if (path.startsWith('/experimental')) {
6370
var newPath = path.substring('/experimental'.length);
6471
if (newPath.isEmpty) newPath = '/';
@@ -85,6 +92,9 @@ Future<shelf.Response> appHandler(
8592
return await shelfPubApi(request);
8693
} else if (path.startsWith('/packages/')) {
8794
return await _packageHandler(request);
95+
} else if (path.startsWith('/documentation')) {
96+
return documentationHandler(
97+
request.context['_originalRequest'] as shelf.Request ?? request);
8898
} else if (path.startsWith('/doc')) {
8999
return _docHandler(request);
90100
} else if (path == '/robots.txt' && !isProductionHost(request)) {

app/lib/shared/handler_helpers.dart

+6-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ shelf.Request _sanitizeRequestedUri(shelf.Request request) {
114114
// (The pub client will not remove it and instead directly try to request
115115
// "GET //api/..." :-/ )
116116
final changedUri = uri.replace(path: normalizedResource);
117-
return new shelf.Request(
117+
final sanitized = new shelf.Request(
118118
request.method,
119119
changedUri,
120120
protocolVersion: request.protocolVersion,
@@ -123,5 +123,10 @@ shelf.Request _sanitizeRequestedUri(shelf.Request request) {
123123
encoding: request.encoding,
124124
context: request.context,
125125
);
126+
if (!sanitized.context.containsKey('_originalRequest')) {
127+
return sanitized.change(context: {'_originalRequest': request});
128+
} else {
129+
return sanitized;
130+
}
126131
}
127132
}

app/test/frontend/handlers_test.dart

+52
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'dart:async';
99
import 'package:test/test.dart';
1010
import 'package:yaml/yaml.dart';
1111

12+
import 'package:pub_dartlang_org/dartdoc/backend.dart';
1213
import 'package:pub_dartlang_org/frontend/backend.dart';
1314
import 'package:pub_dartlang_org/frontend/handlers_redirects.dart';
1415
import 'package:pub_dartlang_org/frontend/models.dart';
@@ -18,6 +19,7 @@ import 'package:pub_dartlang_org/shared/analyzer_client.dart';
1819
import 'package:pub_dartlang_org/shared/dartdoc_client.dart';
1920
import 'package:pub_dartlang_org/shared/search_service.dart';
2021

22+
import '../dartdoc/handlers_test.dart' show DartdocBackendMock;
2123
import '../shared/handlers_test_utils.dart';
2224
import '../shared/utils.dart';
2325

@@ -441,6 +443,56 @@ void main() {
441443
});
442444
});
443445

446+
group('/documentation', () {
447+
test('/documentation/flutter redirect', () async {
448+
expectRedirectResponse(
449+
await issueGet('/documentation/flutter'),
450+
'https://docs.flutter.io/',
451+
);
452+
});
453+
454+
test('/documentation/flutter/version redirect', () async {
455+
expectRedirectResponse(
456+
await issueGet('/documentation/flutter/version'),
457+
'https://docs.flutter.io/',
458+
);
459+
});
460+
461+
test('/documentation/foo/bar redirect', () async {
462+
expectRedirectResponse(
463+
await issueGet('/documentation/foor/bar'),
464+
'https://pub.dartlang.org/documentation/foor/bar/',
465+
);
466+
});
467+
468+
scopedTest('trailing slash redirect', () async {
469+
expectRedirectResponse(
470+
await issueGet('/documentation/foo'), '/documentation/foo/latest/');
471+
});
472+
473+
scopedTest('/documentation/no_pkg redirect', () async {
474+
registerDartdocBackend(new DartdocBackendMock());
475+
expectRedirectResponse(await issueGet('/documentation/no_pkg/latest/'),
476+
'/packages/no_pkg/versions');
477+
});
478+
479+
test('dartdocs.org redirect', () async {
480+
expectRedirectResponse(
481+
await issueGetUri(
482+
Uri.parse('https://dartdocs.org/documentation/pkg/latest/')),
483+
'https://pub.dartlang.org/documentation/pkg/latest/',
484+
);
485+
});
486+
487+
test('www.dartdocs.org redirect', () async {
488+
expectRedirectResponse(
489+
await issueGetUri(
490+
Uri.parse('https://www.dartdocs.org/documentation/pkg/latest/')),
491+
'https://pub.dartlang.org/documentation/pkg/latest/',
492+
);
493+
});
494+
});
495+
444496
group('old api', () {
445497
scopedTest('/packages.json', () async {
446498
final backend =

app/test/frontend/handlers_test_utils.dart

+7-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
library pub_dartlang_org.handlers_test;
5+
library pub_dartlang_org.frontend.handlers_test;
66

77
import 'dart:async';
88

@@ -22,9 +22,13 @@ import 'package:pub_dartlang_org/shared/search_client.dart';
2222
import 'package:pub_dartlang_org/shared/search_service.dart';
2323
import 'package:pub_dartlang_org/shared/urls.dart';
2424

25-
Future<shelf.Response> issueGet(String path) async {
25+
Future<shelf.Response> issueGet(String path) {
2626
final uri = '$siteRoot$path';
27-
final request = new shelf.Request('GET', Uri.parse(uri));
27+
return issueGetUri(Uri.parse(uri));
28+
}
29+
30+
Future<shelf.Response> issueGetUri(Uri uri) async {
31+
final request = new shelf.Request('GET', uri);
2832
return appHandler(request, null);
2933
}
3034

dispatch.yaml

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
dispatch:
22
- url: "*.dartdocs.org/*"
3-
service: dartdoc
4-
- url: "pub.dartlang.org/documentation"
5-
service: dartdoc
6-
- url: "pub.dartlang.org/documentation/*"
7-
service: dartdoc
3+
service: default
84
- url: "dartdocs.org/*"
9-
service: dartdoc
5+
service: default
106

0 commit comments

Comments
 (0)