     }
     
     public func request(_ request: AWSRequest) throws -> Prorsum.Response {
-        var prorsumRequest = try request.toProrsumRequest()
-        switch request.httpMethod {
-        case "GET":
+        
+        func createProrsumRequestWithSignedURL(_ request: AWSRequest) throws -> Request {
+            var prorsumRequest = try request.toProrsumRequest()
             prorsumRequest.url = signer.signedURL(url: prorsumRequest.url)
             prorsumRequest.headers["Host"] = prorsumRequest.url.hostWithPort!
-            
-        default:
+            return prorsumRequest
+        }
+        
+        func createProrsumRequestWithSignedHeader(_ request: AWSRequest) throws -> Request {
+            var prorsumRequest = try request.toProrsumRequest()
             // TODO avoid copying
             var headers: [String: String] = [:]
             for (key, value) in prorsumRequest.headers {

            for (key, value) in signedHeaders {
                prorsumRequest.headers[key] = value
            }
        }
        
        // TODO implement Keep-alive

            var code: String?
            var message: String?
            
            switch serviceProtocol {
            case .query:
                guard let dict = bodyDict["ErrorResponse"] as? [String: Any] else {
                    break
                }
                let errorDict = dict["Error"] as? [String: Any]
                code = errorDict?["Code"] as? String
                message = errorDict?["Message"] as? String
            
            case .restxml:
                let errorDict = bodyDict["Error"] as? [String: Any]
                code = errorDict?["Code"] as? String
                message = errorDict?["Message"] as? String
                
            case .restjson:
                code = response.headers["x-amzn-ErrorType"]
                message = bodyDict.filter({ $0.key.lowercased() == "message" }).first?.value as? String
            
            case .json:
                code = bodyDict["__type"] as? String
                message = bodyDict.filter({ $0.key.lowercased() == "message" }).first?.value as? String
            
            default:
                break
            }
            
            if let errorCode = code {
