@@ -3,6 +3,7 @@ package http
33import (
44 "errors"
55 "fmt"
6+ "io/ioutil"
67 "net/http"
78 "net/http/httptest"
89 "net/url"
@@ -151,7 +152,7 @@ func TestRetryableTransport_POST(t *testing.T) {
151152 defer server .Close ()
152153
153154 rwrtr := runtime .ClientRequestWriterFunc (func (req runtime.ClientRequest , _ strfmt.Registry ) error {
154- return req .SetBodyParam ("test result " )
155+ return req .SetBodyParam ("test body " )
155156 })
156157
157158 hu , _ := url .Parse (server .URL )
@@ -178,3 +179,59 @@ func TestRetryableTransport_POST(t *testing.T) {
178179 actual := result .(string )
179180 require .EqualValues (t , "test result" , actual )
180181}
182+
183+ func TestRetryableTransportWithRetry_POST (t * testing.T ) {
184+ attempts := 0
185+
186+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
187+ attempts ++
188+
189+ if attempts == 1 {
190+ reset := fmt .Sprintf ("%d" , time .Now ().Add (1 * time .Second ).Unix ())
191+ body , err := ioutil .ReadAll (req .Body )
192+ require .NoError (t , err )
193+ require .Equal (t , "\" test body\" \n " , string (body ))
194+ rw .Header ().Set ("X-RateLimit-Reset" , reset )
195+ rw .WriteHeader (http .StatusTooManyRequests )
196+ rw .Write ([]byte ("rate limited" ))
197+ } else {
198+ body , err := ioutil .ReadAll (req .Body )
199+ require .NoError (t , err )
200+ require .Equal (t , "\" test body\" \n " , string (body ))
201+ rw .WriteHeader (http .StatusOK )
202+ rw .Write ([]byte ("ok" ))
203+ }
204+ }))
205+ defer server .Close ()
206+
207+ rwrtr := runtime .ClientRequestWriterFunc (func (req runtime.ClientRequest , _ strfmt.Registry ) error {
208+ return req .SetBodyParam ("test body" )
209+ })
210+
211+ hu , _ := url .Parse (server .URL )
212+ rt := NewRetryableTransport (httptransport .New (hu .Host , "/" , []string {"http" }), 2 )
213+
214+ res , err := rt .Submit (& runtime.ClientOperation {
215+ ID : "getSites" ,
216+ Method : "POST" ,
217+ PathPattern : "/" ,
218+ Params : rwrtr ,
219+ Reader : runtime .ClientResponseReaderFunc (func (response runtime.ClientResponse , consumer runtime.Consumer ) (interface {}, error ) {
220+ if response .Code () == 200 {
221+ var result string
222+ if err := consumer .Consume (response .Body (), & result ); err != nil {
223+ return nil , err
224+ }
225+ return result , nil
226+ }
227+ return nil , errors .New ("Generic error" )
228+ }),
229+ })
230+
231+ require .NoError (t , err )
232+ require .Equal (t , 2 , attempts )
233+
234+ require .IsType (t , "" , res )
235+ actual := res .(string )
236+ require .EqualValues (t , "ok" , actual )
237+ }
0 commit comments