blob: 01238c21eb532bb9c533fb9770ed0ca4c6f5caba [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library shelf_static.test_util;
import 'dart:async';
import 'package:path/path.dart' as p;
import 'package:shelf/shelf.dart';
import 'package:shelf_static/src/util.dart';
final p.Context _ctx = p.url;
/// Makes a simple GET request to [handler] and returns the result.
Future<Response> makeRequest(Handler handler, String path,
{String scriptName}) {
var rootedHandler = _rootHandler(scriptName, handler);
return syncFuture(() => rootedHandler(_fromPath(path)));
}
Request _fromPath(String path) =>
new Request('GET', Uri.parse('http://localhost' + path));
Handler _rootHandler(String scriptName, Handler handler) {
if (scriptName == null || scriptName.isEmpty) {
return handler;
}
if (!scriptName.startsWith('/')) {
throw new ArgumentError('scriptName must start with "/" or be empty');
}
return (Request request) {
if (!_ctx.isWithin(scriptName, request.requestedUri.path)) {
return new Response.notFound('not found');
}
assert(request.scriptName.isEmpty);
var relativePath = _ctx.relative(request.requestedUri.path,
from: scriptName);
assert(!relativePath.startsWith('/'));
relativePath = '/' + relativePath;
var url = new Uri(path: relativePath, query: request.url.query,
fragment: request.url.fragment);
var relativeRequest = _copy(request, scriptName, url);
return handler(relativeRequest);
};
}
// TODO: until we have on https://code.google.com/p/dart/issues/detail?id=18453
Request _copy(Request r, String scriptName, Uri url) {
return new Request(r.method, r.requestedUri,
protocolVersion: r.protocolVersion, headers: r.headers, url: url,
scriptName: scriptName, body: r.read(), context: r.context);
}