183 lines
4.5 KiB
Go
183 lines
4.5 KiB
Go
package soap
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/masterzen/simplexml/dom"
|
|
)
|
|
|
|
type HeaderOption struct {
|
|
key string
|
|
value string
|
|
}
|
|
|
|
func NewHeaderOption(name string, value string) *HeaderOption {
|
|
return &HeaderOption{key: name, value: value}
|
|
}
|
|
|
|
type SoapHeader struct {
|
|
to string
|
|
replyTo string
|
|
maxEnvelopeSize string
|
|
timeout string
|
|
locale string
|
|
id string
|
|
action string
|
|
shellId string
|
|
resourceURI string
|
|
options []HeaderOption
|
|
message *SoapMessage
|
|
}
|
|
|
|
type HeaderBuilder interface {
|
|
To(string) *SoapHeader
|
|
ReplyTo(string) *SoapHeader
|
|
MaxEnvelopeSize(int) *SoapHeader
|
|
Timeout(string) *SoapHeader
|
|
Locale(string) *SoapHeader
|
|
Id(string) *SoapHeader
|
|
Action(string) *SoapHeader
|
|
ShellId(string) *SoapHeader
|
|
resourceURI(string) *SoapHeader
|
|
AddOption(*HeaderOption) *SoapHeader
|
|
Options([]HeaderOption) *SoapHeader
|
|
Build(*SoapMessage) *SoapMessage
|
|
}
|
|
|
|
func (self *SoapHeader) To(uri string) *SoapHeader {
|
|
self.to = uri
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) ReplyTo(uri string) *SoapHeader {
|
|
self.replyTo = uri
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) MaxEnvelopeSize(size int) *SoapHeader {
|
|
self.maxEnvelopeSize = strconv.Itoa(size)
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Timeout(timeout string) *SoapHeader {
|
|
self.timeout = timeout
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Id(id string) *SoapHeader {
|
|
self.id = id
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Action(action string) *SoapHeader {
|
|
self.action = action
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Locale(locale string) *SoapHeader {
|
|
self.locale = locale
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) ShellId(shellId string) *SoapHeader {
|
|
self.shellId = shellId
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) ResourceURI(resourceURI string) *SoapHeader {
|
|
self.resourceURI = resourceURI
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) AddOption(option *HeaderOption) *SoapHeader {
|
|
self.options = append(self.options, *option)
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Options(options []HeaderOption) *SoapHeader {
|
|
self.options = options
|
|
return self
|
|
}
|
|
|
|
func (self *SoapHeader) Build() *SoapMessage {
|
|
header := self.createElement(self.message.envelope, "Header", DOM_NS_SOAP_ENV)
|
|
|
|
if self.to != "" {
|
|
to := self.createElement(header, "To", DOM_NS_ADDRESSING)
|
|
to.SetContent(self.to)
|
|
}
|
|
|
|
if self.replyTo != "" {
|
|
replyTo := self.createElement(header, "ReplyTo", DOM_NS_ADDRESSING)
|
|
a := self.createMUElement(replyTo, "Address", DOM_NS_ADDRESSING, true)
|
|
a.SetContent(self.replyTo)
|
|
}
|
|
|
|
if self.maxEnvelopeSize != "" {
|
|
envelope := self.createMUElement(header, "MaxEnvelopeSize", DOM_NS_WSMAN_DMTF, true)
|
|
envelope.SetContent(self.maxEnvelopeSize)
|
|
}
|
|
|
|
if self.timeout != "" {
|
|
timeout := self.createElement(header, "OperationTimeout", DOM_NS_WSMAN_DMTF)
|
|
timeout.SetContent(self.timeout)
|
|
}
|
|
|
|
if self.id != "" {
|
|
id := self.createElement(header, "MessageID", DOM_NS_ADDRESSING)
|
|
id.SetContent(self.id)
|
|
}
|
|
|
|
if self.locale != "" {
|
|
locale := self.createMUElement(header, "Locale", DOM_NS_WSMAN_DMTF, false)
|
|
locale.SetAttr("xml:lang", self.locale)
|
|
datalocale := self.createMUElement(header, "DataLocale", DOM_NS_WSMAN_MSFT, false)
|
|
datalocale.SetAttr("xml:lang", self.locale)
|
|
}
|
|
|
|
if self.action != "" {
|
|
action := self.createMUElement(header, "Action", DOM_NS_ADDRESSING, true)
|
|
action.SetContent(self.action)
|
|
}
|
|
|
|
if self.shellId != "" {
|
|
selectorSet := self.createElement(header, "SelectorSet", DOM_NS_WSMAN_DMTF)
|
|
selector := self.createElement(selectorSet, "Selector", DOM_NS_WSMAN_DMTF)
|
|
selector.SetAttr("Name", "ShellId")
|
|
selector.SetContent(self.shellId)
|
|
}
|
|
|
|
if self.resourceURI != "" {
|
|
resource := self.createMUElement(header, "ResourceURI", DOM_NS_WSMAN_DMTF, true)
|
|
resource.SetContent(self.resourceURI)
|
|
}
|
|
|
|
if len(self.options) > 0 {
|
|
set := self.createElement(header, "OptionSet", DOM_NS_WSMAN_DMTF)
|
|
for _, option := range self.options {
|
|
e := self.createElement(set, "Option", DOM_NS_WSMAN_DMTF)
|
|
e.SetAttr("Name", option.key)
|
|
e.SetContent(option.value)
|
|
}
|
|
}
|
|
|
|
return self.message
|
|
}
|
|
|
|
func (self *SoapHeader) createElement(parent *dom.Element, name string, ns dom.Namespace) (element *dom.Element) {
|
|
element = dom.CreateElement(name)
|
|
parent.AddChild(element)
|
|
ns.SetTo(element)
|
|
return
|
|
}
|
|
|
|
func (self *SoapHeader) createMUElement(parent *dom.Element, name string, ns dom.Namespace, mustUnderstand bool) (element *dom.Element) {
|
|
element = self.createElement(parent, name, ns)
|
|
value := "false"
|
|
if mustUnderstand {
|
|
value = "true"
|
|
}
|
|
element.SetAttr("mustUnderstand", value)
|
|
return
|
|
}
|