package http

import (
	
	
	
	
	
)

// AddErrorCloseResponseBodyMiddleware adds the middleware to automatically
// close the response body of an operation request if the request response
// failed.
func ( *middleware.Stack) error {
	return .Deserialize.Insert(&errorCloseResponseBodyMiddleware{}, "OperationDeserializer", middleware.Before)
}

type errorCloseResponseBodyMiddleware struct{}

func (*errorCloseResponseBodyMiddleware) () string {
	return "ErrorCloseResponseBody"
}

func ( *errorCloseResponseBodyMiddleware) (
	 context.Context,  middleware.DeserializeInput,  middleware.DeserializeHandler,
) (
	 middleware.DeserializeOutput,  middleware.Metadata,  error,
) {
	, ,  := .HandleDeserialize(, )
	if  != nil {
		if ,  := .RawResponse.(*Response);  &&  != nil && .Body != nil {
			// Consume the full body to prevent TCP connection resets on some platforms
			_, _ = io.Copy(ioutil.Discard, .Body)
			// Do not validate that the response closes successfully.
			.Body.Close()
		}
	}

	return , , 
}

// AddCloseResponseBodyMiddleware adds the middleware to automatically close
// the response body of an operation request, after the response had been
// deserialized.
func ( *middleware.Stack) error {
	return .Deserialize.Insert(&closeResponseBody{}, "OperationDeserializer", middleware.Before)
}

type closeResponseBody struct{}

func (*closeResponseBody) () string {
	return "CloseResponseBody"
}

func ( *closeResponseBody) (
	 context.Context,  middleware.DeserializeInput,  middleware.DeserializeHandler,
) (
	 middleware.DeserializeOutput,  middleware.Metadata,  error,
) {
	, ,  := .HandleDeserialize(, )
	if  != nil {
		return , , 
	}

	if ,  := .RawResponse.(*Response);  {
		// Consume the full body to prevent TCP connection resets on some platforms
		,  := io.Copy(ioutil.Discard, .Body)
		if  != nil {
			middleware.GetLogger().Logf(logging.Warn, "failed to discard remaining HTTP response body, this may affect connection reuse")
		}

		 := .Body.Close()
		if  != nil {
			middleware.GetLogger().Logf(logging.Warn, "failed to close HTTP response body, this may affect connection reuse")
		}
	}

	return , , 
}