示例#1
0
    def do_POST(self):
        '''The POST command.
        '''
        try:
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml, resolver=cid.Resolve)
            else:
                length = int(self.headers['content-length'])
                ps = ParsedSoap(self.rfile.read(length))
        except ParseException as e:
            self.send_fault(FaultFromZSIException(e))
            return
        except Exception as e:
            # Faulted while processing; assume it's in the header.
            self.send_fault(FaultFromException(e, 1, sys.exc_info()[2]))
            return

        _Dispatch(ps,
                  self.server.modules,
                  self.send_xml,
                  self.send_fault,
                  docstyle=self.server.docstyle,
                  nsdict=self.server.nsdict,
                  typesmodule=self.server.typesmodule,
                  rpc=self.server.rpc)
示例#2
0
    def do_POST(self):
        '''The POST command.  This is called by HTTPServer, not twisted.
        action -- SOAPAction(HTTP header) or wsa:Action(SOAP:Header)
        '''
        global _contexts

        soapAction = self.headers.getheader('SOAPAction')
        post = self.path
        if not post:
            raise PostNotSpecified, 'HTTP POST not specified in request'
        if soapAction:
            soapAction = soapAction.strip('\'"')
        post = post.strip('\'"')
        try:
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml,
                                resolver=cid.Resolve,
                                readerclass=DomletteReader)
            else:
                length = int(self.headers['content-length'])
                ps = ParsedSoap(self.rfile.read(length),
                                readerclass=DomletteReader)
        except ParseException, e:
            self.send_fault(FaultFromZSIException(e))
示例#3
0
def AsCGI(nsdict={}, typesmodule=None, rpc=False, modules=None):
    '''Dispatch within a CGI script.
    '''
    if os.environ.get('REQUEST_METHOD') != 'POST':
        _CGISendFault(Fault(Fault.Client, 'Must use POST'))
        return
    ct = os.environ['CONTENT_TYPE']
    try:
        if ct.startswith('multipart/'):
            cid = resolvers.MIMEResolver(ct, sys.stdin)
            xml = cid.GetSOAPPart()
            ps = ParsedSoap(xml, resolver=cid.Resolve)
        else:
            length = int(os.environ['CONTENT_LENGTH'])
            ps = ParsedSoap(sys.stdin.read(length))
    except ParseException as e:
        _CGISendFault(FaultFromZSIException(e))
        return
    _Dispatch(ps,
              modules,
              _CGISendXML,
              _CGISendFault,
              nsdict=nsdict,
              typesmodule=typesmodule,
              rpc=rpc)
示例#4
0
文件: server.py 项目: acigna/pywez
    def do_POST(self):
        '''The POST command.'''

        try:
            # SOAPAction header.
            action = self.headers.get('soapaction', None)
            if not action:
                self.send_fault(
                    Fault(Fault.Client, 'SOAPAction HTTP header missing.'))
                return
            if action != Operation.SOAPAction:
                self.send_fault(Fault(Fault.Client,
                    'SOAPAction is "%s" not "%s"' % \
                    (action, Operation.SOAPAction)))
                return

            # Parse the message.
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml, resolver=cid.Resolve)
            else:
                cl = int(self.headers['content-length'])
                IN = self.rfile.read(cl)
                self.trace(IN, 'RECEIVED')
                ps = ParsedSoap(IN)
        except ParseException, e:
            self.send_fault(FaultFromZSIException(e))
            return
示例#5
0
 def checkt6(self):
     try:
         istr = StringIO.StringIO(intext)
         m = mimetools.Message(istr)
         cid = resolvers.MIMEResolver(m['content-type'], istr)
         xml = cid.GetSOAPPart()
         ps = ParsedSoap(xml, resolver=cid.Resolve)
     except ParseException, e:
         print >> OUT, FaultFromZSIException(e).AsSOAP()
         self.fail()
示例#6
0
 def checkt5(self):
     istr = StringIO.StringIO(intext)
     m = mimetools.Message(istr)
     if m.gettype()[0:10] == "multipart/":
         cid = resolvers.MIMEResolver(m['content-type'], istr)
         xml = cid.GetSOAPPart()
         print 'xml=', xml.getvalue()
         for h, b in cid.parts:
             print h, b.read()
         dom = PyExpat.Reader().fromStream(xml)
         print dom
示例#7
0
    def do_POST(self):
        '''The POST command.  This is called by HTTPServer, not twisted.
        action -- SOAPAction(HTTP header) or wsa:Action(SOAP:Header)
        '''
        global _contexts

        soapAction = self.headers.getheader('SOAPAction')
        post = self.path
        if not post:
            raise PostNotSpecified('HTTP POST not specified in request')
        if soapAction:
            soapAction = soapAction.strip('\'"')
        post = post.strip('\'"')
        try:
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml,
                                resolver=cid.Resolve,
                                readerclass=DomletteReader)
            else:
                length = int(self.headers['content-length'])
                ps = ParsedSoap(self.rfile.read(length),
                                readerclass=DomletteReader)
        except ParseException as e:
            self.send_fault(FaultFromZSIException(e))
        except Exception as e:
            # Faulted while processing; assume it's in the header.
            self.send_fault(FaultFromException(e, 1, sys.exc_info()[2]))
        else:
            # Keep track of calls
            thread_id = _thread.get_ident()
            _contexts[thread_id] = SOAPContext(self.server, xml, ps,
                                               self.connection, self.headers,
                                               soapAction)

            try:
                _Dispatch(ps,
                          self.server,
                          self.send_xml,
                          self.send_fault,
                          post=post,
                          action=soapAction)
            except Exception as e:
                self.send_fault(FaultFromException(e, 0, sys.exc_info()[2]))

            # Clean up after the call
            if thread_id in _contexts:
                del _contexts[thread_id]
示例#8
0
 def do_POST(self):
     '''The POST command.
     '''
     try:
         ct = self.headers['content-type']
         if ct.startswith('multipart/'):
             cid = resolvers.MIMEResolver(ct, self.rfile)
             xml = cid.GetSOAPPart()
             ps = ParsedSoap(xml, resolver=cid.Resolve)
         else:
             length = int(self.headers['content-length'])
             ps = ParsedSoap(self.rfile.read(length))
     except ParseException, e:
         self.send_fault(FaultFromZSIException(e))
         return
示例#9
0
def AsJonPy(request=None, modules=None, **kw):
    '''Dispatch within a jonpy CGI/FastCGI script.
    '''

    kw['request'] = request
    if request.environ.get('REQUEST_METHOD') != 'POST':
        _JonPySendFault(Fault(Fault.Client, 'Must use POST'), **kw)
        return
    ct = request.environ['CONTENT_TYPE']
    try:
        if ct.startswith('multipart/'):
            cid = resolvers.MIMEResolver(ct, request.stdin)
            xml = cid.GetSOAPPart()
            ps = ParsedSoap(xml, resolver=cid.Resolve)
        else:
            length = int(request.environ['CONTENT_LENGTH'])
            ps = ParsedSoap(request.stdin.read(length))
    except ParseException, e:
        _JonPySendFault(FaultFromZSIException(e), **kw)
        return
示例#10
0
    def do_POST(self):
        '''The POST command.
        action -- SOAPAction(HTTP header) or wsa:Action(SOAP:Header)
        '''
        self._fix_chunked_encoding()

        logger.debug("Request Host: {}".format(self.client_address))
        logger.debug("Request URI: {}".format(self.requestline))
        for key, value in self.headers.items():
            logger.debug("Request Header: {}: {}".format(key, value))
        content_type = self.headers.get("content-type", '')
        action_matchobj = re.search("action=\"(urn:\w+)\"", content_type)
        if action_matchobj is not None:
            # SOAP 1.2
            soapAction = action_matchobj.group(1)
        else:
            # SOAP 1.1
            soapAction = self.headers.getheader('SOAPAction')
            if soapAction:
                soapAction = soapAction.strip('\'"')
        self._soapAction = soapAction
        post = self.path
        if not post:
            raise PostNotSpecified, 'HTTP POST not specified in request'
        post = post.strip('\'"')
        try:
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml, resolver=cid.Resolve)
            else:
                length = int(self.headers['content-length'])
                xml = self.rfile.read(length)
                logger.debug("Request Body: {}".format(xml))
                ps = ParsedSoap(xml)
        except ParseException, e:
            self.send_fault(FaultFromZSIException(e))
示例#11
0
    def checkt6(self):
        try:
            istr = io.StringIO(intext)
            m = mimetools.Message(istr)
            cid = resolvers.MIMEResolver(m['content-type'], istr)
            xml = cid.GetSOAPPart()
            ps = ParsedSoap(xml, resolver=cid.Resolve)
        except ParseException as e:
            print(FaultFromZSIException(e).AsSOAP(), file=OUT)
            self.fail()
        except Exception as e:
            # Faulted while processing; assume it's in the header.
            print(FaultFromException(e, 1,
                                     sys.exc_info()[2]).AsSOAP(),
                  file=OUT)
            self.fail()

        try:
            dict = ps.Parse(typecode)
        except Exception as e:
            # Faulted while processing; now it's the body
            print(FaultFromException(e, 0,
                                     sys.exc_info()[2]).AsSOAP(),
                  file=OUT)
            self.fail()

        self.assertEqual(dict['stringtest'], strExtTest,
                         "Failed to extract stringtest correctly")
        print(base64.encodestring(cid['*****@*****.**'].read()))
        v = dict['b64']
        print(type(v), 'is type(v)')
        self.assertEqual(cid['*****@*****.**'].getvalue(), v, "mismatch")
        print(base64.encodestring(v))
        from ZSI.wstools.c14n import Canonicalize
        z = dict['xmltest']
        print(type(z), z)
        print(Canonicalize(z))
示例#12
0
    def do_POST(self):
        '''The POST command.'''

        try:
            # SOAPAction header.
            action = self.headers.get('soapaction', None)
            if not action:
                self.send_fault(
                    Fault(Fault.Client, 'SOAPAction HTTP header missing.'))
                return
            if action != Operation.SOAPAction:
                self.send_fault(Fault(Fault.Client,
                    'SOAPAction is "%s" not "%s"' % \
                    (action, Operation.SOAPAction)))
                return

            # Parse the message.
            ct = self.headers['content-type']
            if ct.startswith('multipart/'):
                cid = resolvers.MIMEResolver(ct, self.rfile)
                xml = cid.GetSOAPPart()
                ps = ParsedSoap(xml, resolver=cid.Resolve)
            else:
                cl = int(self.headers['content-length'])
                IN = self.rfile.read(cl)
                self.trace(IN, 'RECEIVED')
                ps = ParsedSoap(IN)
        except ParseException as e:
            self.send_fault(FaultFromZSIException(e))
            return
        except Exception as e:
            # Faulted while processing; assume it's in the header.
            self.send_fault(FaultFromException(e, 1, sys.exc_info()[2]))
            return

        try:
            # Actors?
            a = ps.WhatActorsArePresent()
            if len(a):
                self.send_fault(FaultFromActor(a[0]))
                return

            # Is the operation defined?
            root = ps.body_root
            if root.namespaceURI != Operation.ns:
                self.send_fault(
                    Fault(Fault.Client,
                          'Incorrect namespace "%s"' % root.namespaceURI))
                return
            n = root.localName
            op = Operation.dispatch.get(n, None)
            if not op:
                self.send_fault(
                    Fault(Fault.Client, 'Undefined operation "%s"' % n))
                return

            # Scan headers.  First, see if we understand all headers with
            # mustUnderstand set. Then, get the ones intended for us (ignoring
            # others since step 1 insured they're not mustUnderstand).
            for mu in ps.WhatMustIUnderstand():
                if mu not in op.headers:
                    uri, localname = mu
                    self.send_fault(FaultFromNotUnderstood(uri, localname))
                    return
            headers = [
                e for e in ps.GetMyHeaderElements()
                if (e.namespaceURI, e.localName) in op.headers
            ]
            nsdict = {'Z': Operation.ns}
            if headers:
                nsdict['E'] = Operation.hdr_ns
                self.process_headers(headers, ps)
            else:
                self.headertext = None

            try:
                results = op.TCin.parse(ps.body_root, ps)
            except ParseException as e:
                self.send_fault(FaultFromZSIException(e))
            self.trace(str(results), 'PARSED')
            if op.convert:
                results = op.convert(results)
            if op.nsdict: nsdict.update(op.nsdict)
            reply = StringIO.StringIO()
            sw = SoapWriter(reply, nsdict=nsdict, header=self.headertext)
            sw.serialize(results,
                         op.TCout,
                         name='Z:' + n + 'Response',
                         inline=1)
            sw.close()
            self.send_xml(reply.getvalue())
        except Exception as e:
            # Fault while processing; now it's in the body.
            self.send_fault(FaultFromException(e, 0, sys.exc_info()[2]))
            return