Swift Siesta redirect response to failure

175 views Asked by At

Is possible using Siesta pipeline, receive a success response, parsing it, and depending of the return, redirect it to a failure response?

My server response many times return a HTTP 200, but with a error message/flag.

1

There are 1 answers

1
Paul Cantrell On BEST ANSWER

If by “redirect” you mean “transform an HTTP success into a Siesta error,” then yes, this is possible. The pipeline can arbitrarily transform successes into errors and vice versa.

Write a ResponseTransformer that unwraps the .success case, checks whether the error flags are set (whatever they are), and if so returns a newly constructed .failure.

For example, here is a sketch of a transformer that checks for an X-My-API-Error header on a 200, and if it is present returns an error:

struct APIErrorHandler: ResponseTransformer {
  func process(_ response: Response) -> Response {
    switch response {
      case .success(let entity):
        if let errorMessage = entity.header(forKey: "X-My-API-Error") {
          return logTransformation(
            .failure(Error(userMessage: errorMessage, cause: MyAPIError(), entity: entity)))
        }
        return response

      case .failure:
        return response  // no change
    }
  }
}

Configure it as follows:

service.configure {
  $0.pipeline[.cleanup].add(APIErrorHandler())
}

You might also find it helpful to study the transformer from the example project that turn a 404 into a successful response with false for the content, and the one that overrides Siesta’s default error message with a server-provided one.