1 package http
2
3 import (
4 "context"
5 "errors"
6 "fmt"
7 "net/http"
8
9 "github.com/aws/smithy-go"
10 "github.com/aws/smithy-go/middleware"
11 )
12
13 func ExampleResponseError() {
14 stack := middleware.NewStack("my cool stack", NewStackRequest)
15
16 stack.Deserialize.Add(middleware.DeserializeMiddlewareFunc("wrap http response error",
17 func(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (
18 out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
19 ) {
20 out, metadata, err = next.HandleDeserialize(ctx, in)
21 if err == nil {
22
23 return out, metadata, err
24 }
25
26 rawResp, ok := out.RawResponse.(*Response)
27 if !ok {
28
29 return out, metadata, err
30 }
31
32
33
34 err = &ResponseError{
35 Response: rawResp,
36 Err: err,
37 }
38
39 return out, metadata, err
40 }),
41 middleware.After,
42 )
43
44 stack.Deserialize.Add(middleware.DeserializeMiddlewareFunc("deserialize error",
45 func(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (
46 out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
47 ) {
48 out, metadata, err = next.HandleDeserialize(ctx, in)
49 if err != nil {
50 return middleware.DeserializeOutput{}, metadata, err
51 }
52
53 rawResp := out.RawResponse.(*Response)
54 if rawResp.StatusCode == 200 {
55 return out, metadata, nil
56 }
57
58
59 err = &smithy.GenericAPIError{
60 Code: rawResp.Header.Get("Error-Code"),
61 Message: rawResp.Header.Get("Error-Message"),
62 }
63
64 return out, metadata, err
65 }),
66 middleware.After,
67 )
68
69
70 mockHandler := middleware.HandlerFunc(func(ctx context.Context, in interface{}) (
71 output interface{}, metadata middleware.Metadata, err error,
72 ) {
73
74 resp := &http.Response{
75 StatusCode: 404,
76 Header: http.Header{
77 "Extra-Header": []string{"foo value"},
78 "Error-Code": []string{"FooException"},
79 "Error-Message": []string{"some message about the error"},
80 },
81 }
82
83
84
85 return &Response{
86 Response: resp,
87 }, metadata, nil
88 })
89
90
91
92 handler := middleware.DecorateHandler(mockHandler, stack)
93 _, _, err := handler.Handle(context.Background(), struct{}{})
94 if err == nil {
95 fmt.Printf("expect error, got none")
96 return
97 }
98
99 if err != nil {
100 var apiErr smithy.APIError
101 if errors.As(err, &apiErr) {
102 fmt.Printf("request failed: %s, %s\n", apiErr.ErrorCode(), apiErr.ErrorMessage())
103 }
104
105 var respErr *ResponseError
106 if errors.As(err, &respErr) {
107 fmt.Printf("response status: %v\n", respErr.HTTPStatusCode())
108 fmt.Printf("response header: %v\n", respErr.HTTPResponse().Header.Get("Extra-Header"))
109 }
110 }
111
112
113
114
115
116 }
117
View as plain text