Index: ClientSide.tcl ================================================================== --- ClientSide.tcl +++ ClientSide.tcl @@ -42,21 +42,21 @@ package require WS::Utils #package require Tcl 8.5 if {![llength [info command dict]]} { package require dict } -package require tdom +package require tdom 0.8 package require http 2 package require log package require uri catch { package require tls http::register https 443 ::tls::socket } -package provide WS::Client 1.4.0 +package provide WS::Client 1.4.1 namespace eval ::WS::Client { ## ## serviceArr is indexed by service name and contains a dictionary that ## defines the service. The dictionary has the following structure: @@ -1548,11 +1548,11 @@ ::log::log debug "In parseResults $serviceName $operationName {$inXML}" set serviceInfo $serviceArr($serviceName) set outTransform [dict get $serviceInfo outTransform] if {![string equal $outTransform {}]} { - set query [$outTransform $serviceName $operationName REPLY $inXML] + set inXML [$outTransform $serviceName $operationName REPLY $inXML] } set expectedMsgType [dict get $serviceInfo operation $operationName outputs] dom parse $inXML doc $doc documentElement top @@ -1570,11 +1570,12 @@ set rootNode [$body childNodes] ::log::log debug "Have [llength $rootNode]" if {[llength $rootNode] > 1} { foreach tmp $rootNode { #puts "\t Got {[$tmp localName]} looking for {$expectedMsgType}" - if {[string equal [$tmp localName] $expectedMsgType]} { + if {[string equal [$tmp localName] $expectedMsgType] || + [string equal [$tmp nodeName] $expectedMsgType]} { set rootNode $tmp break } } } @@ -1625,27 +1626,27 @@ ## ## Convert the packet to a dictionary ## set results {} - set headerRootNode [$rootNode selectNodes ENV:Header] + set headerRootNode [$top selectNodes ENV:Header] foreach outHeaderType [dict get $serviceInfo operation $operationName soapReplyHeader] { if {[string equal $outHeaderType {}]} { continue } - ::log::log debug "Calling [list ::WS::Utils::convertTypeToDict Client $serviceName $rootNode $outHeaderType $rootNode]" set xns [dict get [::WS::Utils::GetServiceTypeDef Client $serviceName $outputHeaderType] xns] set node [$headerRootNode selectNodes $xns:outHeaderType] if {[llength $outHeaderAttrs]} { ::WS::Utils::setAttr $node $outHeaderAttrs } - lappend results [::WS::Utils::convertTypeToDict Client $serviceName $node $outHeaderType $rootNode] + ::log::log debug "Calling [list ::WS::Utils::convertTypeToDict Client $serviceName $node $outHeaderType $headerRootNode]" + lappend results [::WS::Utils::convertTypeToDict Client $serviceName $node $outHeaderType $headerRootNode] } - ::log::log debug "Calling [list ::WS::Utils::convertTypeToDict Client $serviceName $rootNode $expectedMsgType $rootNode]" + ::log::log debug "Calling [list ::WS::Utils::convertTypeToDict Client $serviceName $rootNode $expectedMsgType $body]" if {![string equal $rootName {}]} { lappend results [::WS::Utils::convertTypeToDict \ - Client $serviceName $rootNode $expectedMsgType $rootNode] + Client $serviceName $rootNode $expectedMsgType $body] } set results [join $results] $doc delete set ::errorCode {} set ::errorInfo {} @@ -1906,11 +1907,15 @@ } $env appendChild [$doc createElement "SOAP-ENV:Body" bod] set callXns [dict get $serviceInfo operation $operationName xns] - $bod appendChild [$doc createElement $callXns:$operationName reply] + if {![string is space $callXns]} { + $bod appendChild [$doc createElement $callXns:$operationName reply] + } else { + $bod appendChild [$doc createElement $operationName reply] + } $reply setAttribute \ SOAP-ENV:encodingStyle "http://schemas.xmlsoap.org/soap/encoding/" ::WS::Utils::convertDictToEncodedType Client $serviceName $doc $reply $argList $msgType @@ -2937,10 +2942,15 @@ {} \ "\n" \ [$doc asXML -indent none -doctypeDeclaration 0] #regsub "\]*>\n" [::dom::DOMImplementation serialize $doc] {} xml $doc delete + + set inTransform [dict get $serviceInfo inTransform] + if {![string equal $inTransform {}]} { + set xml [$inTransform $serviceName $operationName REQUEST $xml $url $argList] + } ::log::log debug "Leaving ::::WS::Client::buildRestCallquery with {$xml}" return $xml @@ -2993,10 +3003,14 @@ proc ::WS::Client::parseRestResults {serviceName objectName operationName inXML} { variable serviceArr ::log::log debug "In parseResults $serviceName $operationName {$inXML}" set serviceInfo $serviceArr($serviceName) + set outTransform [dict get $serviceInfo outTransform] + if {![string equal $outTransform {}]} { + set inXML [$outTransform $serviceName $operationName REPLY $inXML] + } set expectedMsgType [dict get $serviceInfo object $objectName operation $operationName outputs] dom parse $inXML doc $doc documentElement top set xns {} foreach tmp [dict get $serviceInfo targetNamespace] { Index: ServerSide.tcl ================================================================== --- ServerSide.tcl +++ ServerSide.tcl @@ -45,11 +45,11 @@ } package require html package require log package require tdom -package provide WS::Server 1.4.0 +package provide WS::Server 1.4.1 namespace eval ::WS::Server { array set serviceArr {} set procInfo {} set mode {} @@ -125,10 +125,11 @@ # Defaults to "/service/" plus the service name # -traceEnabled - Boolean to enable/disable trace being passed back in exception # Defaults to "Y" # -docFormat - Format of the documentation for operations ("text" or "html"). # Defaults to "text" +# -stylesheet - The CSS stylesheet URL used in the HTML documentation # # # Returns : Nothing # # Side-Effects : None @@ -170,10 +171,11 @@ -description {} -mode {tclhttpd} -ports {80} -traceEnabled {Y} -docFormat {text} + -stylesheet {} } array set defaults $args if {[string equal $defaults(-mode) channel]} { set defaults(-ports) {stdin stdout} array set defaults $args @@ -1661,10 +1663,13 @@ if {[string equal $serviceData(-description) {}]} { ::html::description "Automatically generated human readable documentation for '$service'" } else { ::html::description $serviceData(-description) } + if {$serviceData(-stylesheet) != ""} { + ::html::headTag "link rel=\"stylesheet\" type=\"text/css\" href=\"$serviceData(-stylesheet)\"" + } set head $serviceData(-htmlhead) set msg [::html::head $head] append msg [::html::bodyTag] array unset serviceData -service Index: Utilities.tcl ================================================================== --- Utilities.tcl +++ Utilities.tcl @@ -42,14 +42,14 @@ package require Tcl 8.4 if {![llength [info command dict]]} { package require dict } package require log -package require tdom +package require tdom 0.8 package require struct::set -package provide WS::Utils 1.4.0 +package provide WS::Utils 1.4.1 namespace eval ::WS {} namespace eval ::WS::Utils { set typeInfo {} @@ -1110,23 +1110,27 @@ ::log::log debug "\t type def = {$typeDefInfo}" set xns [dict get $typeDefInfo xns] if {[$node hasAttribute href]} { set node [GetReferenceNode $root [$node getAttribute href]] } + ::log::log debug "\t XML of node is [$node asXML]" if {[info exists mutableTypeInfo([list $mode $serviceName $type])]} { set type [(*)[lindex mutableTypeInfo([list $mode $serviceName $type]) 0] $mode $serviceName $type $xns $node] set typeDefInfo [dict get $typeInfo $mode $serviceName $type] + ::log::log debug "\t type def replaced with = {$typeDefInfo}" } set results {} #if {$options(parseInAttr)} { # foreach attr [$node attributes] { # if {[llength $attr] == 1} { # dict set results $attr [$node getAttribute $attr] # } # } #} - foreach partName [dict keys [dict get $typeDefInfo definition]] { + set partsList [dict keys [dict get $typeDefInfo definition]] + ::log::log debug "\t partsList is {$partsList}" + foreach partName $partsList { set partType [dict get $typeDefInfo definition $partName type] if {[string equal $partName *] && [string equal $partType *]} { ## ## Type infomation being handled dynamically for this part ## @@ -1174,10 +1178,22 @@ continue } } } } + set origItemList $item + set newItemList {} + foreach item $origItemList { + if {[$item hasAttribute href]} { + set oldXML [$item asXML] + set item [GetReferenceNode $root [$item getAttribute href]] + ::log::log debug "\t\t Replacing: $oldXML" + ::log::log debug "\t\t With: [$item asXML]" + } + lappend newItemList $item + } + set item $newItemList switch $typeInfoList { {0 0} { ## ## Simple non-array ## @@ -2146,24 +2162,26 @@ switch [dict get [::uri::split $url] scheme] { file { upvar #0 [::uri::geturl $url] token set xml $token(data) unset token + ProcessImportXml $mode $baseUrl $xml $serviceName $serviceInfoVar $tnsCountVar } http { set ncode -1 catch { set token [::http::geturl $url] ::http::wait $token set ncode [::http::ncode $token] set xml [::http::data $token] ::http::cleanup $token + ProcessImportXml $mode $baseUrl $xml $serviceName $serviceInfoVar $tnsCountVar } if {$ncode != 200} { return \ -code error \ - -errorcode [list WS CLIENT HTTPFAIL $url] \ + -errorcode [list WS CLIENT HTTPFAIL $url $ncode] \ "HTTP get of import file failed '$url'" } } default { return \ @@ -2170,11 +2188,10 @@ -code error \ -errorcode [list WS CLIENT UNKURLTYP $url] \ "Unknown URL type '$url'" } } - ProcessImportXml $mode $baseUrl $xml $serviceName $serviceInfoVar $tnsCountVar } ########################################################################### # Index: pkgIndex.tcl ================================================================== --- pkgIndex.tcl +++ pkgIndex.tcl @@ -8,12 +8,12 @@ # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded WS::Channel 1.4.0 [list source [file join $dir ChannelServer.tcl]] package ifneeded WS::CheckAndBuild 0.0.3 [list source [file join $dir CheckAndBuild.tcl]] -package ifneeded WS::Client 1.4.0 [list source [file join $dir ClientSide.tcl]] +package ifneeded WS::Client 1.4.1 [list source [file join $dir ClientSide.tcl]] package ifneeded WS::Embeded 1.4.0 [list source [file join $dir Embedded.tcl]] -package ifneeded WS::Server 1.4.0 [list source [file join $dir ServerSide.tcl]] -package ifneeded WS::Utils 1.4.0 [list source [file join $dir Utilities.tcl]] +package ifneeded WS::Server 1.4.1 [list source [file join $dir ServerSide.tcl]] +package ifneeded WS::Utils 1.4.1 [list source [file join $dir Utilities.tcl]] package ifneeded WS::Wub 1.4.0 [list source [file join $dir WubServer.tcl]] package ifneeded WS::AOLserver 1.4.0 [list source [file join $dir AOLserver.tcl]] package ifneeded Wsdl 1.0 [list source [file join $dir WubServer.tcl]]