retriablerequest.go raw

   1  package 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  
  17  import (
  18  	"bytes"
  19  	"io"
  20  	"net/http"
  21  )
  22  
  23  // NewRetriableRequest returns a wrapper around an HTTP request that support retry logic.
  24  func NewRetriableRequest(req *http.Request) *RetriableRequest {
  25  	return &RetriableRequest{req: req}
  26  }
  27  
  28  // Request returns the wrapped HTTP request.
  29  func (rr *RetriableRequest) Request() *http.Request {
  30  	return rr.req
  31  }
  32  
  33  func (rr *RetriableRequest) prepareFromByteReader() (err error) {
  34  	// fall back to making a copy (only do this once)
  35  	b := []byte{}
  36  	if rr.req.ContentLength > 0 {
  37  		b = make([]byte, rr.req.ContentLength)
  38  		_, err = io.ReadFull(rr.req.Body, b)
  39  		if err != nil {
  40  			return err
  41  		}
  42  	} else {
  43  		b, err = io.ReadAll(rr.req.Body)
  44  		if err != nil {
  45  			return err
  46  		}
  47  	}
  48  	rr.br = bytes.NewReader(b)
  49  	rr.req.Body = io.NopCloser(rr.br)
  50  	return err
  51  }
  52