1package autorest 2 3// Copyright 2017 Microsoft Corporation 4// 5// Licensed under the Apache License, Version 2.0 (the "License"); 6// you may not use this file except in compliance with the License. 7// You may obtain a copy of the License at 8// 9// http://www.apache.org/licenses/LICENSE-2.0 10// 11// Unless required by applicable law or agreed to in writing, software 12// distributed under the License is distributed on an "AS IS" BASIS, 13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14// See the License for the specific language governing permissions and 15// limitations under the License. 16 17import ( 18 "bytes" 19 "io" 20 "io/ioutil" 21 "net/http" 22) 23 24// NewRetriableRequest returns a wrapper around an HTTP request that support retry logic. 25func NewRetriableRequest(req *http.Request) *RetriableRequest { 26 return &RetriableRequest{req: req} 27} 28 29// Request returns the wrapped HTTP request. 30func (rr *RetriableRequest) Request() *http.Request { 31 return rr.req 32} 33 34func (rr *RetriableRequest) prepareFromByteReader() (err error) { 35 // fall back to making a copy (only do this once) 36 b := []byte{} 37 if rr.req.ContentLength > 0 { 38 b = make([]byte, rr.req.ContentLength) 39 _, err = io.ReadFull(rr.req.Body, b) 40 if err != nil { 41 return err 42 } 43 } else { 44 b, err = ioutil.ReadAll(rr.req.Body) 45 if err != nil { 46 return err 47 } 48 } 49 rr.br = bytes.NewReader(b) 50 rr.req.Body = ioutil.NopCloser(rr.br) 51 return err 52} 53