...

Source file src/github.com/aws/smithy-go/transport/http/response_error_example_test.go

Documentation: github.com/aws/smithy-go/transport/http

     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  				// Nothing to do when there is no error.
    23  				return out, metadata, err
    24  			}
    25  
    26  			rawResp, ok := out.RawResponse.(*Response)
    27  			if !ok {
    28  				// No raw response to wrap with.
    29  				return out, metadata, err
    30  			}
    31  
    32  			// Wrap the returned error with the response error containing the
    33  			// returned response.
    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  			// Deserialize the response API error values.
    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  	// Mock example handler taking the request input and returning a response
    70  	mockHandler := middleware.HandlerFunc(func(ctx context.Context, in interface{}) (
    71  		output interface{}, metadata middleware.Metadata, err error,
    72  	) {
    73  		// populate the mock response with an API error and additional data.
    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  		// The handler's returned response will be available as the
    84  		// DeserializeOutput.RawResponse field.
    85  		return &Response{
    86  			Response: resp,
    87  		}, metadata, nil
    88  	})
    89  
    90  	// Use the stack to decorate the handler then invoke the decorated handler
    91  	// with the inputs.
    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  	// Output:
   113  	// request failed: FooException, some message about the error
   114  	// response status: 404
   115  	// response header: foo value
   116  }
   117  

View as plain text