@@ -20,6 +20,7 @@ import (
20
20
"net/http"
21
21
"net/url"
22
22
"regexp"
23
+ "strings"
23
24
"time"
24
25
25
26
"github.com/beevik/etree"
@@ -282,28 +283,32 @@ func (sp *ServiceProvider) MakeRedirectAuthenticationRequest(relayState string)
282
283
283
284
// Redirect returns a URL suitable for using the redirect binding with the request
284
285
func (r * AuthnRequest ) Redirect (relayState string , sp * ServiceProvider ) (* url.URL , error ) {
285
- w := & bytes. Buffer {}
286
- w1 := base64 .NewEncoder (base64 .StdEncoding , w )
287
- w2 , _ := flate .NewWriter (w1 , 9 )
286
+ var requestStr strings. Builder
287
+ base64Writer := base64 .NewEncoder (base64 .StdEncoding , & requestStr )
288
+ compressedWriter , _ := flate .NewWriter (base64Writer , 9 )
288
289
doc := etree .NewDocument ()
289
290
doc .SetRoot (r .Element ())
290
- if _ , err := doc .WriteTo (w2 ); err != nil {
291
- panic ( err )
291
+ if _ , err := doc .WriteTo (compressedWriter ); err != nil {
292
+ return nil , err
292
293
}
293
- if err := w2 .Close (); err != nil {
294
- panic ( err )
294
+ if err := compressedWriter .Close (); err != nil {
295
+ return nil , err
295
296
}
296
- if err := w1 .Close (); err != nil {
297
- panic (err )
297
+ if err := base64Writer .Close (); err != nil {
298
+ return nil , err
299
+ }
300
+
301
+ rv , err := url .Parse (r .Destination )
302
+ if err != nil {
303
+ return nil , err
298
304
}
299
305
300
- rv , _ := url .Parse (r .Destination )
301
306
// We can't depend on Query().set() as order matters for signing
302
307
query := rv .RawQuery
303
308
if len (query ) > 0 {
304
- query += "&SAMLRequest=" + url .QueryEscape (w .String ())
309
+ query += "&SAMLRequest=" + url .QueryEscape (requestStr .String ())
305
310
} else {
306
- query += "SAMLRequest=" + url .QueryEscape (w .String ())
311
+ query += "SAMLRequest=" + url .QueryEscape (requestStr .String ())
307
312
}
308
313
309
314
if relayState != "" {
0 commit comments