Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Changeset 1833

Show
Ignore:
Timestamp:
06/05/07 10:34:36 (1 year ago)
Author:
nahi
Message:
  • let Header::Handler touch SOAPHeader on on_outbound. if a method on_outboud is defined as arity > 0, on_outboud is called with a SOAPHeader as a parameter. otherwise on_bound is called with no parameter as before. closes #354.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/soap/element.rb

    r1825 r1833  
    103103    @encodingstyle = nil 
    104104    if data 
     105      if data.respond_to?(:to_xml) 
     106        data = SOAP::SOAPRawData.new(data) 
     107      elsif defined?(::REXML) and data.is_a?(::REXML::Element) 
     108        data = SOAP::SOAPRawData.new(SOAP::SOAPREXMLElementWrap.new(data)) 
     109      end 
    105110      if data.respond_to?(:elename) 
    106111        add(data.elename.name, data) 
     
    120125      yield(data) 
    121126    end 
    122     generator.encode_tag_end(name, true
     127    generator.encode_tag_end(name, @data.size > 0
    123128  end 
    124129 
     
    185190  include SOAPEnvelopeElement 
    186191 
     192  attr_writer :force_encode 
     193 
    187194  def initialize 
    188195    super(nil) 
    189196    @elename = EleHeaderName 
    190197    @encodingstyle = nil 
     198    @force_encode = false 
    191199  end 
    192200 
     
    197205      yield(data) 
    198206    end 
    199     generator.encode_tag_end(name, true
     207    generator.encode_tag_end(name, @data.size > 0
    200208  end 
    201209 
     
    212220  end 
    213221  alias size length 
     222 
     223  def encode? 
     224    @force_encode or length > 0 
     225  end 
    214226end 
    215227 
     
    249261    name = ns.name(@elename) 
    250262    generator.encode_tag(name, attrs) 
    251  
    252     yield(@header) if @header and @header.length > 0 
     263    yield(@header) if @header and @header.encode? 
    253264    yield(@body) 
    254  
    255265    generator.encode_tag_end(name, true) 
    256266  end 
  • trunk/lib/soap/header/handler.rb

    r1824 r1833  
    3737  end 
    3838 
    39   def on_outbound_headeritem 
    40     item = on_outbound 
     39  def on_outbound_headeritem(header) 
     40    arity = self.method(:on_outbound).arity 
     41    item = (arity == 0) ? on_outbound : on_outbound(header) 
    4142    if item.nil? 
    4243      nil 
     
    5152  end 
    5253 
    53   def on_inbound_headeritem(header
    54     on_inbound(header.element, header.mustunderstand) 
     54  def on_inbound_headeritem(header, item
     55    on_inbound(item.element, item.mustunderstand) 
    5556  end 
    5657end 
  • trunk/lib/soap/header/handlerset.rb

    r1824 r1833  
    3939 
    4040  # returns: Array of SOAPHeaderItem 
    41   def on_outbound 
     41  def on_outbound(header) 
    4242    @store.collect { |handler| 
    43       handler.on_outbound_headeritem 
     43      handler.on_outbound_headeritem(header) 
    4444    }.compact 
    4545  end 
    4646 
    47   # headers: SOAPHeaderItem enumerable object 
    48   def on_inbound(headers
    49     headers.each do |name, item| 
     47  # header: SOAPHeaderItem enumerable object 
     48  def on_inbound(header
     49    header.each do |name, item| 
    5050      handler = @store.find { |handler| 
    5151        handler.elename == item.element.elename 
    5252      } 
    5353      if handler 
    54         handler.on_inbound_headeritem(item) 
     54        handler.on_inbound_headeritem(header, item) 
    5555      elsif item.mustunderstand 
    5656        raise UnhandledMustUnderstandHeaderError.new(item.element.elename.to_s) 
  • trunk/lib/soap/rpc/proxy.rb

    r1825 r1833  
    236236 
    237237  def create_request_header 
    238     headers = @headerhandler.on_outbound 
    239     if headers.empty? 
    240       nil 
    241     else 
    242       h = ::SOAP::SOAPHeader.new 
    243       headers.each do |header| 
    244         h.add(header.elename.name, header) 
    245       end 
    246       h 
    247     end 
    248   end 
    249  
    250   def receive_headers(headers) 
    251     @headerhandler.on_inbound(headers) if headers 
     238    header = ::SOAP::SOAPHeader.new 
     239    items = @headerhandler.on_outbound(header) 
     240    items.each do |item| 
     241      header.add(item.elename.name, item) 
     242    end 
     243    header 
     244  end 
     245 
     246  def receive_headers(header) 
     247    @headerhandler.on_inbound(header) if header 
    252248  end 
    253249 
  • trunk/lib/soap/rpc/router.rb

    r1825 r1833  
    275275 
    276276  def call_headers(headerhandler) 
    277     headers = headerhandler.on_outbound 
    278     if headers.empty? 
    279       nil 
    280     else 
    281       h = ::SOAP::SOAPHeader.new 
    282       headers.each do |header| 
    283         h.add(header.elename.name, header) 
    284       end 
    285       h 
    286     end 
    287   end 
    288  
    289   def receive_headers(headerhandler, headers) 
    290     headerhandler.on_inbound(headers) if headers 
     277    header = ::SOAP::SOAPHeader.new 
     278    items = headerhandler.on_outbound(header) 
     279    items.each do |item| 
     280      header.add(item.elename.name, item) 
     281    end 
     282    header 
     283  end 
     284 
     285  def receive_headers(headerhandler, header) 
     286    headerhandler.on_inbound(header) if header 
    291287  end 
    292288 
  • trunk/lib/soap/wsdlDriver.rb

    r1824 r1833  
    397397 
    398398    def create_request_header 
    399       headers = @proxy.headerhandler.on_outbound 
    400       if headers.empty? 
    401         nil 
    402       else 
    403         h = SOAPHeader.new 
    404         headers.each do |header| 
    405           h.add(header.elename.name, header) 
    406         end 
    407         h 
    408       end 
    409     end 
    410  
    411     def receive_headers(headers) 
    412       @proxy.headerhandler.on_inbound(headers) if headers 
     399      header = SOAPHeader.new 
     400      items = @proxy.headerhandler.on_outbound(header) 
     401      items.each do |item| 
     402        header.add(item.elename.name, item) 
     403      end 
     404      header 
     405    end 
     406 
     407    def receive_headers(header) 
     408      @proxy.headerhandler.on_inbound(header) if header 
    413409    end 
    414410 
  • trunk/test/soap/test_empty.rb

    r1658 r1833  
    22require 'soap/rpc/standaloneServer' 
    33require 'soap/rpc/driver' 
     4require 'soap/header/handler' 
    45 
    56 
     
    910class TestEmpty < Test::Unit::TestCase 
    1011  Port = 17171 
     12 
     13  class EmptyHeaderHandler < SOAP::Header::Handler 
     14    def on_outbound(header) 
     15      # dump Header even if no header item given. 
     16      header.force_encode = true 
     17      # no additional header item 
     18      nil 
     19    end 
     20  end 
    1121 
    1222  class NopServer < SOAP::RPC::StandaloneServer 
     
    4959    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
    5060    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    51   <env:Body> 
    52   </env:Body> 
     61  <env:Body></env:Body> 
     62</env:Envelope>] 
     63 
     64  EMPTY_HEADER_XML = %q[<?xml version="1.0" encoding="utf-8" ?> 
     65<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     66    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
     67    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     68  <env:Header></env:Header> 
     69  <env:Body></env:Body> 
    5370</env:Envelope>] 
    5471 
     
    6784  end 
    6885 
     86  def test_empty_header 
     87    @client.headerhandler << EmptyHeaderHandler.new(nil) 
     88    @client.wiredump_dev = str = '' 
     89    @client.nop 
     90    assert_equal(EMPTY_HEADER_XML, parse_requestxml(str)) 
     91  end 
     92 
    6993  def parse_requestxml(str) 
    7094    str.split(/\r?\n\r?\n/)[3]