import Hummingbird import Infrastructure /// Keeps the site out of search engines: every response — pages, files, redirects, errors — is marked `X-Robots-Tag: noindex, nofollow`. /// /// A header rather than `robots.txt`, which stays open on purpose: a crawler barred from a page never reads its `noindex`, and may still /// list the bare URL from links elsewhere. A header also covers what carries no markup, such as the photos sellers upload. public struct NoIndexMiddleware: RouterMiddleware { // MARK: Constants /// The directive stamped on every response. public static var directive: String { "noindex, nofollow" } // MARK: Initializers /// Creates the middleware. public init() {} // MARK: Methods public func handle( _ request: Request, context: Context, next: (Request, Context) async throws -> Response ) async throws -> Response { do { var response = try await next(request, context) response.headers[.robotsTag] = Self.directive return response } catch let error as HTTPError { // An error thrown past this point becomes a response further out: the mark travels with it. var error = error error.headers[.robotsTag] = Self.directive throw error } } }