retriablerequest_1.7.go raw

   1  //go:build !go1.8
   2  // +build !go1.8
   3  
   4  // Copyright 2017 Microsoft Corporation
   5  //
   6  //  Licensed under the Apache License, Version 2.0 (the "License");
   7  //  you may not use this file except in compliance with the License.
   8  //  You may obtain a copy of the License at
   9  //
  10  //      http://www.apache.org/licenses/LICENSE-2.0
  11  //
  12  //  Unless required by applicable law or agreed to in writing, software
  13  //  distributed under the License is distributed on an "AS IS" BASIS,
  14  //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15  //  See the License for the specific language governing permissions and
  16  //  limitations under the License.
  17  
  18  package autorest
  19  
  20  import (
  21  	"bytes"
  22  	"io"
  23  	"net/http"
  24  )
  25  
  26  // RetriableRequest provides facilities for retrying an HTTP request.
  27  type RetriableRequest struct {
  28  	req *http.Request
  29  	br  *bytes.Reader
  30  }
  31  
  32  // Prepare signals that the request is about to be sent.
  33  func (rr *RetriableRequest) Prepare() (err error) {
  34  	// preserve the request body; this is to support retry logic as
  35  	// the underlying transport will always close the reqeust body
  36  	if rr.req.Body != nil && rr.req.Body != http.NoBody {
  37  		if rr.br != nil {
  38  			_, err = rr.br.Seek(0, 0 /*io.SeekStart*/)
  39  			rr.req.Body = io.NopCloser(rr.br)
  40  		}
  41  		if err != nil {
  42  			return err
  43  		}
  44  		if rr.br == nil {
  45  			// fall back to making a copy (only do this once)
  46  			err = rr.prepareFromByteReader()
  47  		}
  48  	}
  49  	return err
  50  }
  51  
  52  func removeRequestBody(req *http.Request) {
  53  	req.Body = nil
  54  	req.ContentLength = 0
  55  }
  56