>>>
return environment.barback.getAssetById(id).then((result) {
  return result;
}).then((asset) => _serveAsset(request, asset)).catchError(
    (error,
        trace) {
  if (error is! AssetNotFoundException) throw error;
  return environment.barback
      .getAssetById(id.addExtension("/index.html"))
      .then((asset) {
    if (request.url.path.endsWith('/')) return _serveAsset(request, asset);

    // We only want to serve index.html if the URL explicitly ends in a
    // slash. For other URLs, we redirect to one with the slash added to
    // implicitly support that too. This follows Apache's behavior.
    logRequest(request, "302 Redirect to ${request.url}/");
    return new shelf.Response.found('${request.url}/');
  }).catchError((newError, newTrace) {
    // If we find neither the original file or the index, we should report
    // the error about the original to the user.
    throw newError is AssetNotFoundException ? error : newError;
  });
}).catchError(
    (error,
        trace) {
  if (error is! AssetNotFoundException) {
    trace = new Chain.forTrace(trace);
    logRequest(request, "$error\n$trace");

    addError(error, trace);
    close();
    return new shelf.Response.internalServerError();
  }

  addResult(new BarbackServerResult._failure(request.url, id, error));
  return notFound(request, asset: id);
});
<<<
return environment.barback
    .getAssetById(id)
    .then((result) {
      return result;
    })
    .then((asset) => _serveAsset(request, asset))
    .catchError((error, trace) {
      if (error is! AssetNotFoundException) throw error;
      return environment.barback
          .getAssetById(id.addExtension("/index.html"))
          .then((asset) {
        if (request.url.path.endsWith('/')) return _serveAsset(request, asset);

        // We only want to serve index.html if the URL explicitly ends in a
        // slash. For other URLs, we redirect to one with the slash added to
        // implicitly support that too. This follows Apache's behavior.
        logRequest(request, "302 Redirect to ${request.url}/");
        return new shelf.Response.found('${request.url}/');
      }).catchError((newError, newTrace) {
        // If we find neither the original file or the index, we should report
        // the error about the original to the user.
        throw newError is AssetNotFoundException ? error : newError;
      });
    })
    .catchError((error, trace) {
      if (error is! AssetNotFoundException) {
        trace = new Chain.forTrace(trace);
        logRequest(request, "$error\n$trace");

        addError(error, trace);
        close();
        return new shelf.Response.internalServerError();
      }

      addResult(new BarbackServerResult._failure(request.url, id, error));
      return notFound(request, asset: id);
    });