Adding Cookie to SOAPpy Request
Question: I'm trying to send a SOAP request using SOAPpy as the client. I've found some
documentation stating how to add a cookie by extending SOAPpy.HTTPTransport,
but I can't seem to get it to work.

I tried to use the example
[here](http://code.activestate.com/recipes/444758/), but the server I'm trying
to send the request to started throwing 415 errors, so I'm trying to
accomplish this without using ClientCookie, or by figuring out why the server
is throwing 415's when I do use it. I suspect it might be because ClientCookie
uses urllib2 & http/1.1, whereas SOAPpy uses urllib & http/1.0

Does someone know how to make ClientCookie use http/1.0, if that is even the
problem, or a way to add a cookie to the SOAPpy headers without using
ClientCookie? If tried this code using other services, it only seems to throw
errors when sending requests to Microsoft servers.

I'm still finding my footing with python, so it could just be me doing
something dumb.

    
    
    import sys, os, string
    from SOAPpy import WSDL,HTTPTransport,Config,SOAPAddress,Types
    import ClientCookie
    
    Config.cookieJar = ClientCookie.MozillaCookieJar()
    
    class CookieTransport(HTTPTransport):
      def call(self, addr, data, namespace, soapaction = None, encoding = None,
        http_proxy = None, config = Config):
    
        if not isinstance(addr, SOAPAddress):
          addr = SOAPAddress(addr, config)
    
        cookie_cutter = ClientCookie.HTTPCookieProcessor(config.cookieJar)
        hh = ClientCookie.HTTPHandler()
        hh.set_http_debuglevel(1)
    
        # TODO proxy support
        opener = ClientCookie.build_opener(cookie_cutter, hh)
    
        t = 'text/xml';
        if encoding != None:
          t += '; charset="%s"' % encoding
        opener.addheaders = [("Content-Type", t),
              ("Cookie", "Username=foobar"), # ClientCookie should handle
              ("SOAPAction" , "%s" % (soapaction))]
    
        response = opener.open(addr.proto + "://" + addr.host + addr.path, data)
        data = response.read()
    
        # get the new namespace
        if namespace is None:
          new_ns = None
        else:
          new_ns = self.getNS(namespace, data)
    
        print '\n' * 4 , '-'*50
        # return response payload
        return data, new_ns
    
    
    url = 'http://www.authorstream.com/Services/Test.asmx?WSDL'
    proxy = WSDL.Proxy(url, transport=CookieTransport)
    print proxy.GetList()
    


Answer: Error 415 is because of incorrect content-type header.

Install httpfox for firefox or whatever tool (wireshark, Charles or Fiddler)
to track what headers are you sending. Try Content-Type: application/xml.

    
    
    ...
    t = 'application/xml';
    if encoding != None:
      t += '; charset="%s"' % encoding
    ...
    

If you trying to send file to the web server use Content-
Type:application/x-www-form-urlencoded

