From 836fe4b015295e541094ea31ad58e164ee12c290 Mon Sep 17 00:00:00 2001 From: Andrey Golikov Date: Mon, 24 Oct 2022 19:59:09 +0300 Subject: [PATCH] add support soap 12 --- server_tmpl.go | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/server_tmpl.go b/server_tmpl.go index 0841fc8..b7ab015 100644 --- a/server_tmpl.go +++ b/server_tmpl.go @@ -5,12 +5,12 @@ var serverTmpl = ` var WSDLUndefinedError = errors.New("Server was unable to process request. --> Object reference not set to an instance of an object.") type SOAPEnvelopeRequest struct { - XMLName xml.Name ` + "`" + `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` + "`" + ` + XMLName xml.Name ` + "`" + `xml:"Envelope"` + "`" + ` Body SOAPBodyRequest } type SOAPBodyRequest struct { - XMLName xml.Name ` + "`" + `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"` + "`" + ` + XMLName xml.Name ` + "`" + `xml:"Body"` + "`" + ` {{range .}} {{range .Operations}} {{$requestType := findType .Input.Message | replaceReservedWords | makePublic}} ` + ` @@ -36,6 +36,14 @@ func NewSOAPEnvelopResponse() *SOAPEnvelopeResponse { } } +func NewSOAP12EnvelopResponse() *SOAPEnvelopeResponse { + return &SOAPEnvelopeResponse{ + PrefixSoap: "http://www.w3.org/2003/05/soap-envelope", + PrefixXsd: "http://www.w3.org/2001/XMLSchema", + PrefixXsi: "http://www.w3.org/2001/XMLSchema-instance", + } +} + type Fault struct { ` + ` XMLName xml.Name ` + "`" + `xml:"SOAP-ENV:Fault"` + "`" + ` Space string ` + "`" + `xml:"xmlns:SOAP-ENV,omitempty,attr"` + "`" + ` @@ -73,7 +81,14 @@ func (service *SOAPBodyRequest) {{$requestType}}Func(request *{{$requestType}}) func (service *SOAPEnvelopeRequest) call(w http.ResponseWriter, r *http.Request) { - w.Header().Add("Content-Type", "text/xml; charset=utf-8") + var isSOAP12 bool + if strings.Index(r.Header.Get("Content-Type"), "application/soap+xml") >= 0 { + w.Header().Add("Content-Type", "application/soap+xml; charset=utf-8") + } else { + w.Header().Add("Content-Type", "text/xml; charset=utf-8") + isSOAP12 = true + } + val := reflect.ValueOf(&service.Body).Elem() n := val.NumField() var field reflect.Value @@ -85,11 +100,18 @@ func (service *SOAPEnvelopeRequest) call(w http.ResponseWriter, r *http.Request) return } - resp := NewSOAPEnvelopResponse() + var resp *SOAPEnvelopeResponse + + if isSOAP12 { + resp = NewSOAP12EnvelopResponse() + } else { + resp = NewSOAPEnvelopResponse() + } + defer func() { if r := recover(); r != nil { resp.Body.Fault = &Fault{} - resp.Body.Fault.Space = "http://schemas.xmlsoap.org/soap/envelope/" + resp.Body.Fault.Space = resp.PrefixSoap resp.Body.Fault.Code = "soap:Server" resp.Body.Fault.Detail = fmt.Sprintf("%v", r) resp.Body.Fault.String = fmt.Sprintf("%v", r) @@ -97,11 +119,6 @@ func (service *SOAPEnvelopeRequest) call(w http.ResponseWriter, r *http.Request) xml.NewEncoder(w).Encode(resp) }() - header := r.Header.Get("Content-Type") - if strings.Index(header, "application/soap+xml") >= 0 { - panic("Could not find an appropriate Transport Binding to invoke.") - } - err := xml.NewDecoder(r.Body).Decode(service) if err != nil { panic(err) @@ -125,6 +142,11 @@ func (service *SOAPEnvelopeRequest) call(w http.ResponseWriter, r *http.Request) if !find { panic(WSDLUndefinedError) } else { + if isSOAP12 { + defer func() { + r.Header.Set("Soapaction", fmt.Sprintf("SOAP12: %s", name)) + }() + } m := val.Addr().MethodByName(name + "Func") if !m.IsValid() { panic(WSDLUndefinedError) @@ -137,7 +159,6 @@ func (service *SOAPEnvelopeRequest) call(w http.ResponseWriter, r *http.Request) panic(vals[1].Interface()) } } - } func Endpoint(w http.ResponseWriter, r *http.Request) {