Skip to content

Commit

Permalink
Adds SoapClient, removing duplicated code from generated source
Browse files Browse the repository at this point in the history
  • Loading branch information
c4milo committed Jan 17, 2014
1 parent 9ca93c9 commit fe09530
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 123 deletions.
30 changes: 0 additions & 30 deletions generator/gowsdl.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,17 +118,6 @@ func (g *GoWsdl) Start() (map[string][]byte, error) {
}
}()

wg.Add(1)
go func() {
defer wg.Done()
var err error

gocode["proxy"], err = g.genSoapProxy()
if err != nil {
log.Println(err)
}
}()

wg.Wait()

gocode["header"], err = g.genHeader()
Expand Down Expand Up @@ -295,25 +284,6 @@ func (g *GoWsdl) genHeader() ([]byte, error) {
return data.Bytes(), nil
}

func (g *GoWsdl) genSoapProxy() ([]byte, error) {
funcMap := template.FuncMap{
"toGoType": toGoType,
"stripns": stripns,
"replaceReservedWords": replaceReservedWords,
"makePublic": makePublic,
"findType": g.findType,
}

data := new(bytes.Buffer)
tmpl := template.Must(template.New("proxy").Funcs(funcMap).Parse(soapProxyTmpl))
err := tmpl.Execute(data, g.wsdl.PortTypes)
if err != nil {
return nil, err
}

return data.Bytes(), nil
}

var reservedWords = map[string]string{
"break": "break_",
"default": "default_",
Expand Down
7 changes: 0 additions & 7 deletions generator/header_tmpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,8 @@ package {{.}}
//Do not modify
//Copyright (c) 2014, Cloudescape. All rights reserved.
import (
"encoding/xml"
"time"
"net"
gowsdl "github.com/c4milo/gowsdl/generator"
"net/http"
"io/ioutil"
"log"
"bytes"
"crypto/tls"
{{/*range .Imports*/}}
{{/*.*/}}
{{/*end*/}}
Expand Down
88 changes: 7 additions & 81 deletions generator/operations_tmpl.go
Original file line number Diff line number Diff line change
@@ -1,75 +1,18 @@
package generator

var opsTmpl = `
var timeout = time.Duration(30 * time.Second)
func dialTimeout(network, addr string) (net.Conn, error) {
return net.DialTimeout(network, addr, timeout)
}
{{range .}}
{{$portType := .Name}}
type {{$portType}} struct {
url string
tls bool
client *gowsdl.SoapClient
}
func New{{$portType}}(url string, tls bool) *{{$portType}} {
service := &{{$portType}}{
url: url,
tls: tls,
}
return service
}
func (service *{{$portType}}) call(operation, soapAction string, request interface{}) ([]byte, error) {
envelope := gowsdl.SoapEnvelope{
Header: gowsdl.SoapHeader{},
EncodingStyle: "http://schemas.xmlsoap.org/soap/encoding/",
}
reqXml, err := xml.Marshal(request)
if err != nil {
return nil, err
}
envelope.Body = gowsdl.SoapBody{
Body: string(reqXml),
}
buffer := &bytes.Buffer{}
encoder := xml.NewEncoder(buffer)
//encoder.Indent(" ", " ")
err = encoder.Encode(envelope)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", service.url, buffer)
req.Header.Add("Content-Type", "text/xml; charset=\"utf-8\"")
req.Header.Add("SOAPAction", soapAction)
req.Header.Set("User-Agent", "gowsdl/0.1")
client := gowsdl.NewSoapClient(url, tls)
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: service.tls,
},
Dial: dialTimeout,
return &{{$portType}}{
client: client,
}
client := &http.Client{Transport: tr}
res, err := client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
return body, nil
}
{{range .Operations}}
Expand All @@ -82,30 +25,13 @@ func dialTimeout(network, addr string) (net.Conn, error) {
* - {{.Name}} {{.Doc}}{{end}}
*/
func (service *{{$portType}}) {{makePublic .Name}} (request *{{$requestType}}) (*{{$output}}, error) {
data, err := service.call("{{.Name}}", "{{$soapAction}}", request)
if err != nil {
return nil, err
}
envelope := &gowsdl.SoapEnvelope{}
err = xml.Unmarshal(data, envelope)
if err != nil {
return nil, err
}
if envelope.Body.Body == "" {
log.Printf("%#v\n", envelope.Body)
return nil, nil
}
res := &{{$output}}{}
err = xml.Unmarshal([]byte(envelope.Body.Body), res)
response := &{{$output}}{}
err := service.client.Call("{{.Name}}", "{{$soapAction}}", request, response)
if err != nil {
return nil, err
}
return res, nil
return response, nil
}
{{end}}
{{end}}
Expand Down
4 changes: 0 additions & 4 deletions generator/proxy_tmpl.go

This file was deleted.

83 changes: 83 additions & 0 deletions generator/soap.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package generator

import (
"bytes"
"crypto/tls"
"encoding/xml"
"io/ioutil"
"log"
"net/http"
)

type SoapEnvelope struct {
Expand All @@ -26,3 +31,81 @@ type SoapFault struct {
faulactor string `xml:"faultactor"`
detail string `xml:"detail"`
}

type SoapClient struct {
url string
tls bool
}

func NewSoapClient(url string, tls bool) *SoapClient {
return &SoapClient{
url: url,
tls: tls,
}
}

func (s *SoapClient) Call(operation, soapAction string, request, response interface{}) error {
envelope := SoapEnvelope{
Header: SoapHeader{},
EncodingStyle: "http://schemas.xmlsoap.org/soap/encoding/",
}

reqXml, err := xml.Marshal(request)
if err != nil {
return err
}

envelope.Body = SoapBody{
Body: string(reqXml),
}

buffer := &bytes.Buffer{}

encoder := xml.NewEncoder(buffer)
//encoder.Indent(" ", " ")

err = encoder.Encode(envelope)
if err != nil {
return err
}

req, err := http.NewRequest("POST", s.url, buffer)
req.Header.Add("Content-Type", "text/xml; charset=\"utf-8\"")
req.Header.Add("SOAPAction", soapAction)
req.Header.Set("User-Agent", "gowsdl/0.1")

tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: s.tls,
},
Dial: dialTimeout,
}

client := &http.Client{Transport: tr}
res, err := client.Do(req)
if err != nil {
return err
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)

respEnvelope := &SoapEnvelope{}

err = xml.Unmarshal(body, respEnvelope)
if err != nil {
return err
}

if respEnvelope.Body.Body == "" {
log.Printf("%#v\n", respEnvelope.Body)
return nil
}

err = xml.Unmarshal([]byte(respEnvelope.Body.Body), response)
if err != nil {
return err
}

return nil
}
2 changes: 1 addition & 1 deletion generator/types_tmpl.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ var typesTmpl = `
{{define "Elements"}}
{{range .}}
{{replaceReservedWords .Name}} {{if eq .MaxOccurs "unbounded"}}[]{{end}}{{.Type | toGoType}} ` + "`" + `xml:"{{.Name}},omitempty"` + "`" + `{{end}}
{{replaceReservedWords .Name | makePublic}} {{if eq .MaxOccurs "unbounded"}}[]{{end}}{{.Type | toGoType}} ` + "`" + `xml:"{{.Name}},omitempty"` + "`" + `{{end}}
{{end}}
{{range .Schemas}}
Expand Down

0 comments on commit fe09530

Please sign in to comment.