From 270f2c1cabd3d2c073ec3a89f516f21ba5b3c070 Mon Sep 17 00:00:00 2001 From: NotZippy Date: Wed, 18 Mar 2015 15:58:03 -0700 Subject: [PATCH] Added configure request callback function, this allows caller to modify the body of the request or add authentication to the header of the request. It is optional to use it Signed-off-by: NotZippy --- generator/header_tmpl.go | 2 ++ generator/operations_tmpl.go | 4 ++-- generator/soap.go | 29 +++++++++++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/generator/header_tmpl.go b/generator/header_tmpl.go index f5679b9..0a8bef8 100644 --- a/generator/header_tmpl.go +++ b/generator/header_tmpl.go @@ -9,9 +9,11 @@ package {{.}} // Do not modify // Copyright (c) 2015, Hooklift. All rights reserved. import ( + "net/http" "encoding/xml" "time" + gowsdl "github.com/hooklift/gowsdl/generator" {{/*range .Imports*/}} {{/*.*/}} diff --git a/generator/operations_tmpl.go b/generator/operations_tmpl.go index f19d8ee..0f36f19 100644 --- a/generator/operations_tmpl.go +++ b/generator/operations_tmpl.go @@ -33,9 +33,9 @@ var opsTmpl = ` // {{range .Faults}} // - {{.Name}} {{.Doc}}{{end}}{{end}} {{if ne .Doc ""}}/* {{.Doc}} */{{end}} - func (service *{{$portType}}) {{makePublic .Name | replaceReservedWords}} ({{if ne $requestType ""}}request *{{$requestType}}{{end}}) (*{{$responseType}}, error) { + func (service *{{$portType}}) {{makePublic .Name | replaceReservedWords}} ({{if ne $requestType ""}}request *{{$requestType}}{{end}}, header *gowsdl.SoapHeader, configureRequest func(*http.Request)) (*{{$responseType}}, error) { response := &{{$responseType}}{} - err := service.client.Call("{{$soapAction}}", {{if ne $requestType ""}}request{{else}}nil{{end}}, response) + err := service.client.Call("{{$soapAction}}", {{if ne $requestType ""}}request{{else}}nil{{end}}, response, header, configureRequest) if err != nil { return nil, err } diff --git a/generator/soap.go b/generator/soap.go index 680c350..97bb9e9 100644 --- a/generator/soap.go +++ b/generator/soap.go @@ -7,10 +7,10 @@ import ( "bytes" "crypto/tls" "encoding/xml" + "gopkg.in/inconshreveable/log15.v2" "io/ioutil" "net/http" - - "gopkg.in/inconshreveable/log15.v2" + "net/http/httputil" ) var Log = log15.New() @@ -20,9 +20,9 @@ func init() { } type SoapEnvelope struct { - XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` - //Header SoapHeader `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header,omitempty"` - Body SoapBody `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"` + XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` + Header *SoapHeader `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header,omitempty"` + Body SoapBody `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"` } type SoapHeader struct { @@ -57,9 +57,9 @@ func NewSoapClient(url string, tls bool) *SoapClient { } } -func (s *SoapClient) Call(soapAction string, request, response interface{}) error { +func (s *SoapClient) Call(soapAction string, request, response interface{}, header *SoapHeader, configureRequest func(*http.Request)) error { envelope := SoapEnvelope{ - //Header: SoapHeader{}, + Header: header, } if request != nil { @@ -73,23 +73,30 @@ func (s *SoapClient) Call(soapAction string, request, response interface{}) erro buffer := &bytes.Buffer{} encoder := xml.NewEncoder(buffer) - //encoder.Indent(" ", " ") + encoder.Indent(" ", " ") err := encoder.Encode(envelope) if err == nil { err = encoder.Flush() } - Log.Debug("request", "envelope", log15.Lazy{func() string { return buffer.String() }}) if err != nil { return err } req, err := http.NewRequest("POST", s.url, buffer) + req.Header.Add("Content-Type", "text/xml; charset=\"utf-8\"") if soapAction != "" { req.Header.Add("SOAPAction", soapAction) } - req.Header.Set("User-Agent", "gowsdl/0.1") + + if configureRequest != nil { + configureRequest(req) + } + + Log.Debug("request", "request", req, + "Header", log15.Lazy{func() string { r, _ := httputil.DumpRequestOut(req, true); return string(r) }}, + ) tr := &http.Transport{ TLSClientConfig: &tls.Config{ @@ -101,6 +108,7 @@ func (s *SoapClient) Call(soapAction string, request, response interface{}) erro client := &http.Client{Transport: tr} res, err := client.Do(req) if err != nil { + Log.Debug("Client error", "err", err) return err } defer res.Body.Close() @@ -110,6 +118,7 @@ func (s *SoapClient) Call(soapAction string, request, response interface{}) erro Log.Warn("empty response") return nil } + Log.Debug("Raw response", "url", s.url, "rawbody", log15.Lazy{func() string { return string(rawbody) }}) respEnvelope := &SoapEnvelope{}