class SipRequest(SipMsg): method = None ruri = None sipver = None def __init__(self, buf = None, method = None, ruri = None, sipver = 'SIP/2.0', to = None, fr0m = None, via = None, cseq = None, \ callid = None, maxforwards = None, body = None, contact = None, routes = (), target = None, cguid = None): SipMsg.__init__(self, buf) if buf != None: return self.method = method self.ruri = ruri if target == None: if len(routes) == 0: self.setTarget(self.ruri.getAddr()) else: self.setTarget(routes[0].getAddr()) else: self.setTarget(target) self.sipver = sipver self.appendHeader(SipHeader(name = 'via', body = via)) if via == None: self.getHFBody('via').genBranch() self.appendHeaders([SipHeader(name = 'route', body = x) for x in routes]) self.appendHeader(SipHeader(name = 'max-forwards', body = maxforwards)) self.appendHeader(SipHeader(name = 'from', body = fr0m)) if to == None: to = SipTo(address = SipAddress(url = ruri)) self.appendHeader(SipHeader(name = 'to', body = to)) self.appendHeader(SipHeader(name = 'call-id', body = callid)) self.appendHeader(SipHeader(name = 'cseq', body = SipCSeq(cseq = cseq, method = method))) if contact != None: self.appendHeader(SipHeader(name = 'contact', body = contact)) if method in ('INVITE', 'REGISTER'): self.appendHeader(SipHeader(name = 'expires')) self.appendHeader(SipHeader(name = 'user-agent')) if cguid != None: self.appendHeader(SipHeader(name = 'cisco-guid', body = cguid)) self.appendHeader(SipHeader(name = 'h323-conf-id', body = cguid)) if body != None: self.setBody(body) def setSL(self, startline): self.method, ruri, self.sipver = startline.split() self.ruri = SipURL(ruri) def getSL(self): return self.method + ' ' + str(self.ruri) + ' ' + self.sipver def getMethod(self): return self.method def getRURI(self): return self.ruri def setRURI(self, ruri): self.ruri = ruri def genResponse(self, scode, reason, body = None): # Should be done at the transaction level # to = self.getHF('to').getBody().getCopy() # if code > 100 and to.getTag() == None: # to.genTag() return SipResponse(scode = scode, reason = reason, sipver = self.sipver, fr0m = self.getHFBody('from').getCopy(), \ callid = self.getHFBody('call-id').getCopy(), vias = [x.getCopy() for x in self.getHFBodys('via')], \ to = self.getHFBody('to').getCopy(), cseq = self.getHFBody('cseq').getCopy(), \ rrs = [x.getCopy() for x in self.getHFBodys('record-route')], body = body) def genACK(self, to = None): if to == None: to = self.getHFBody('to').getCopy() return SipRequest(method = 'ACK', ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBody('from').getCopy(), to = to, \ via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \ cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = self.getHFBody('max-forwards').getCopy()) def genCANCEL(self): return SipRequest(method = 'CANCEL', ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBody('from').getCopy(), to = self.getHFBody('to').getCopy(), \ via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \ cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = self.getHFBody('max-forwards').getCopy(), \ routes = [x.getCopy() for x in self.getHFBodys('route')], target = self.getTarget()) def genRequest(self, method, cseq = None): if cseq == None: cseq = self.getHFBody('cseq').getCSeqNum() return SipRequest(method = method, ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBody('from').getCopy(), to = self.getHFBody('to').getCopy(), \ via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \ cseq = cseq, maxforwards = self.getHFBody('max-forwards').getCopy())
class SipAddress(object): name = None url = None params = None params_order = None hadbrace = None transtable = maketrans('-.!%*_+`\'~', 'a' * 10) def __init__(self, address = None, name = None, url = None, params = None, hadbrace = None, params_order = None, relaxedparser = False): self.params = {} self.params_order = [] self.hadbrace = True if address == None: self.name = name self.url = url if params != None: self.params = params if params_order != None: self.params_order = params_order if hadbrace != None: self.hadbrace = hadbrace return # simple 'sip:foo' case if address.lower().startswith('sip:') and address.find('<') == -1: parts = address.split(';', 1) self.url = SipURL(parts[0], relaxedparser = relaxedparser) if len(parts) == 2: for l in parts[1].split(';'): if not l: continue k_v = l.split('=', 1) if len(k_v) == 2: k, v = k_v else: k = k_v[0] v = None self.params[k] = v if self.params_order.count(k) > 0: self.params_order.remove(k) self.params_order.append(k) self.hadbrace = False return if address.startswith('"'): qpos = findquotes(address) url = None if len(qpos) == 1: self.name = address[1:qpos[0]] url = address[qpos[0] + 1:].strip() else: for i in range(1, len(qpos)): if address.find('<', 1, qpos[i]) != -1: self.name = address[1:qpos[i - 1]] url = address[qpos[i - 1] + 1:].strip() break else: self.name = address[1:qpos[i]] url = address[qpos[i] + 1:].strip() if url == None: raise ValueError('Cannot separate name from URI: %s' % address) if url.startswith('<'): url = url[1:] else: self.name, url = address.split('<', 1) self.name = self.name.strip() url, paramstring = url.split('>', 1) self.url = SipURL(url, relaxedparser = relaxedparser) paramstring = paramstring.strip() if paramstring: for l in paramstring.split(';'): if not l: continue k_v = l.split('=', 1) if len(k_v) == 2: k, v = k_v else: k = k_v[0] v = None self.params[k] = v if self.params_order.count(k) > 0: self.params_order.remove(k) self.params_order.append(k) def __str__(self): return self.localStr() def localStr(self, local_addr = None, local_port = None): if self.hadbrace: od = '<' cd = '>' else: od = '' cd = '' s = '' if self.name != None and len(self.name) > 0: if not self.name.translate(self.transtable).isalnum(): s += '"%s" ' % self.name else: s += self.name + ' ' od = '<' cd = '>' s += od + self.url.localStr(local_addr, local_port) + cd for k in self.params_order: v = self.params[k] if v != None: s += ';' + k + '=' + v else: s += ';' + k return s def getCopy(self): return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), \ hadbrace = self.hadbrace, params_order = self.params_order[:]) def getParam(self, name): return self.params.get(name, None) def setParam(self, name, value = None): self.params[name] = value if self.params_order.count(name) == 0: self.params_order.append(name) def delParam(self, name): del self.params[name] self.params_order.remove(name)
class SipAddress(object): name = None url = None params = None params_order = None hadbrace = None transtable = maketrans('-.!%*_+`\'~', 'a' * 10) def __init__(self, address=None, name=None, url=None, params=None, hadbrace=None, params_order=None, relaxedparser=False): self.params = {} self.params_order = [] self.hadbrace = True if address == None: self.name = name self.url = url if params != None: self.params = params if params_order != None: self.params_order = params_order if hadbrace != None: self.hadbrace = hadbrace return # simple 'sip:foo' case if address.lower().startswith('sip:') and address.find('<') == -1: parts = address.split(';', 1) self.url = SipURL(parts[0], relaxedparser=relaxedparser) if len(parts) == 2: for l in parts[1].split(';'): if not l: continue k_v = l.split('=', 1) if len(k_v) == 2: k, v = k_v else: k = k_v[0] v = None self.params[k] = v if self.params_order.count(k) > 0: self.params_order.remove(k) self.params_order.append(k) self.hadbrace = False return if address.startswith('"'): qpos = findquotes(address) url = None if len(qpos) == 1: self.name = address[1:qpos[0]] url = address[qpos[0] + 1:].strip() else: for i in range(1, len(qpos)): if address.find('<', 1, qpos[i]) != -1: self.name = address[1:qpos[i - 1]] url = address[qpos[i - 1] + 1:].strip() break else: self.name = address[1:qpos[i]] url = address[qpos[i] + 1:].strip() if url == None: raise ValueError('Cannot separate name from URI: %s' % address) if url.startswith('<'): url = url[1:] else: self.name, url = address.split('<', 1) self.name = self.name.strip() url, paramstring = url.split('>', 1) self.url = SipURL(url, relaxedparser=relaxedparser) paramstring = paramstring.strip() if paramstring: for l in paramstring.split(';'): if not l: continue k_v = l.split('=', 1) if len(k_v) == 2: k, v = k_v else: k = k_v[0] v = None self.params[k] = v if self.params_order.count(k) > 0: self.params_order.remove(k) self.params_order.append(k) def __str__(self): return self.localStr() def localStr(self, local_addr=None, local_port=None): if self.hadbrace: od = '<' cd = '>' else: od = '' cd = '' s = '' if self.name != None and len(self.name) > 0: if not self.name.translate(self.transtable).isalnum(): s += '"%s" ' % self.name else: s += self.name + ' ' od = '<' cd = '>' s += od + self.url.localStr(local_addr, local_port) + cd for k in self.params_order: v = self.params[k] if v != None: s += ';' + k + '=' + v else: s += ';' + k return s def getCopy(self): return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), \ hadbrace = self.hadbrace, params_order = self.params_order[:]) def getParam(self, name): return self.params.get(name, None) def setParam(self, name, value=None): self.params[name] = value if self.params_order.count(name) == 0: self.params_order.append(name) def delParam(self, name): del self.params[name] self.params_order.remove(name)
class SipRequest(SipMsg): method = None ruri = None sipver = None user_agent = None def __init__(self, buf = None, method = None, ruri = None, sipver = 'SIP/2.0', to = None, fr0m = None, via = None, cseq = None, \ callid = None, maxforwards = None, body = None, contact = None, routes = (), target = None, cguid = None, user_agent = None, expires = None): SipMsg.__init__(self, buf) if buf != None: return self.method = method self.ruri = ruri if target == None: if len(routes) == 0: self.setTarget(self.ruri.getAddr()) else: self.setTarget(routes[0].getAddr()) else: self.setTarget(target) self.sipver = sipver self.appendHeader(SipHeader(name = 'via', body = via)) if via == None: self.getHFBody('via').genBranch() self.appendHeaders([SipHeader(name = 'route', body = x) for x in routes]) self.appendHeader(SipHeader(name = 'max-forwards', body = maxforwards)) self.appendHeader(SipHeader(name = 'from', body = fr0m)) if to == None: to = SipTo(address = SipAddress(url = ruri)) self.appendHeader(SipHeader(name = 'to', body = to)) self.appendHeader(SipHeader(name = 'call-id', body = callid)) self.appendHeader(SipHeader(name = 'cseq', body = SipCSeq(cseq = cseq, method = method))) if contact != None: self.appendHeader(SipHeader(name = 'contact', body = contact)) if expires == None and method == 'INVITE': expires = SipHeader(name = 'expires') self.appendHeader(expires) elif expires != None: expires = SipHeader(name = 'expires', body = expires) self.appendHeader(expires) if user_agent != None: self.user_agent = user_agent self.appendHeader(SipHeader(name = 'user-agent', bodys = user_agent)) else: self.appendHeader(SipHeader(name = 'user-agent')) if cguid != None: self.appendHeader(SipHeader(name = 'cisco-guid', body = cguid)) self.appendHeader(SipHeader(name = 'h323-conf-id', body = cguid)) if body != None: self.setBody(body) def setSL(self, startline): self.method, ruri, self.sipver = startline.split() self.ruri = SipURL(ruri) def getSL(self): return self.method + ' ' + str(self.ruri) + ' ' + self.sipver def getMethod(self): return self.method def getRURI(self): return self.ruri def setRURI(self, ruri): self.ruri = ruri def genResponse(self, scode, reason, body = None, server = None): # Should be done at the transaction level # to = self.getHF('to').getBody().getCopy() # if code > 100 and to.getTag() == None: # to.genTag() return SipResponse(scode = scode, reason = reason, sipver = self.sipver, fr0m = self.getHFBCopy('from'), \ callid = self.getHFBCopy('call-id'), vias = self.getHFBCopys('via'), \ to = self.getHFBCopy('to'), cseq = self.getHFBCopy('cseq'), \ rrs = self.getHFBCopys('record-route'), body = body, \ server = server) def genACK(self, to = None): if to == None: to = self.getHFBody('to').getCopy() maxforwards = self.getHFBodys('max-forwards') if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None return SipRequest(method = 'ACK', ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBCopy('from'), to = to, \ via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \ cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = maxforward, \ user_agent = self.user_agent) def genCANCEL(self): maxforwards = self.getHFBodys('max-forwards') if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None return SipRequest(method = 'CANCEL', ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBCopy('from'), to = self.getHFBCopy('to'), \ via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \ cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = maxforward, \ routes = self.getHFBCopys('route'), target = self.getTarget(), \ user_agent = self.user_agent) def genRequest(self, method, cseq = None): if cseq == None: cseq = self.getHFBody('cseq').getCSeqNum() maxforwards = self.getHFBodys('max-forwards') if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None expires = self.getHFBodys('expires') if len(expires) > 0: expires = expires[0].getCopy() else: expires = None return SipRequest(method = method, ruri = self.ruri.getCopy(), sipver = self.sipver, \ fr0m = self.getHFBCopy('from'), to = self.getHFBCopy('to'), \ via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \ cseq = cseq, maxforwards = maxforward, \ user_agent = self.user_agent, expires = expires)
class SipAddress(object): name = None url = None params = None hadbrace = None transtable = maketrans('-.!%*_+`\'~', 'a' * 10) def __init__(self, address=None, name=None, url=None, params=None, hadbrace=None): self.params = {} self.hadbrace = True if address == None: self.name = name self.url = url if params != None: self.params = params if hadbrace != None: self.hadbrace = hadbrace return # simple 'sip:foo' case if address.lower().startswith('sip:') and address.find('<') == -1: parts = address.split(';', 1) self.url = SipURL(parts[0]) if len(parts) == 2: for l in parts[1].split(';'): if not l: continue k, v = l.split('=') self.params[k] = v self.hadbrace = False return self.name, url = address.split('<', 1) self.name = self.name.strip() if self.name.startswith('"'): self.name = self.name[1:] if self.name.endswith('"'): self.name = self.name[:-1] url, paramstring = url.split('>', 1) self.url = SipURL(url) paramstring = paramstring.strip() if paramstring: for l in paramstring.split(';'): if not l: continue k, v = l.split('=') self.params[k] = v def __str__(self): return self.localStr() def localStr(self, local_addr=None, local_port=None): if self.hadbrace: od = '<' cd = '>' else: od = '' cd = '' s = '' if self.name != None and len(self.name) > 0: if not self.name.translate(self.transtable).isalnum(): s += '"%s" ' % self.name else: s += self.name + ' ' od = '<' cd = '>' s += od + self.url.localStr(local_addr, local_port) + cd for k, v in self.params.items(): s += ';' + k + '=' + v return s def getCopy(self): return SipAddress(name=self.name, url=self.url.getCopy(), params=self.params.copy(), hadbrace=self.hadbrace) def getParam(self, name): try: return self.params[name] except KeyError: return None def setParam(self, name, value): self.params[name] = value def delParam(self, name): del self.params[name]
class SipRequest(SipMsg): method = None ruri = None sipver = None user_agent = None def __init__( self, buf=None, method=None, ruri=None, sipver="SIP/2.0", to=None, fr0m=None, via=None, cseq=None, callid=None, maxforwards=None, body=None, contact=None, routes=(), target=None, cguid=None, user_agent=None, expires=None, ): SipMsg.__init__(self, buf) if buf != None: return self.method = method self.ruri = ruri if target == None: if len(routes) == 0: self.setTarget(self.ruri.getAddr()) else: self.setTarget(routes[0].getAddr()) else: self.setTarget(target) self.sipver = sipver self.appendHeader(SipHeader(name="via", body=via)) if via == None: self.getHFBody("via").genBranch() self.appendHeaders([SipHeader(name="route", body=x) for x in routes]) self.appendHeader(SipHeader(name="max-forwards", body=maxforwards)) self.appendHeader(SipHeader(name="from", body=fr0m)) if to == None: to = SipTo(address=SipAddress(url=ruri)) self.appendHeader(SipHeader(name="to", body=to)) self.appendHeader(SipHeader(name="call-id", body=callid)) self.appendHeader(SipHeader(name="cseq", body=SipCSeq(cseq=cseq, method=method))) if contact != None: self.appendHeader(SipHeader(name="contact", body=contact)) if expires == None and method == "INVITE": expires = SipHeader(name="expires") self.appendHeader(expires) elif expires != None: expires = SipHeader(name="expires", body=expires) self.appendHeader(expires) if user_agent != None: self.user_agent = user_agent self.appendHeader(SipHeader(name="user-agent", bodys=user_agent)) else: self.appendHeader(SipHeader(name="user-agent")) if cguid != None: self.appendHeader(SipHeader(name="cisco-guid", body=cguid)) self.appendHeader(SipHeader(name="h323-conf-id", body=cguid)) if body != None: self.setBody(body) def setSL(self, startline): self.method, ruri, self.sipver = startline.split() self.ruri = SipURL(ruri) def getSL(self): return self.method + " " + str(self.ruri) + " " + self.sipver def getMethod(self): return self.method def getRURI(self): return self.ruri def setRURI(self, ruri): self.ruri = ruri def genResponse(self, scode, reason, body=None, server=None): # Should be done at the transaction level # to = self.getHF('to').getBody().getCopy() # if code > 100 and to.getTag() == None: # to.genTag() return SipResponse( scode=scode, reason=reason, sipver=self.sipver, fr0m=self.getHFBCopy("from"), callid=self.getHFBCopy("call-id"), vias=self.getHFBCopys("via"), to=self.getHFBCopy("to"), cseq=self.getHFBCopy("cseq"), rrs=self.getHFBCopys("record-route"), body=body, server=server, ) def genACK(self, to=None): if to == None: to = self.getHFBody("to").getCopy() maxforwards = self.getHFBodys("max-forwards") if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None return SipRequest( method="ACK", ruri=self.ruri.getCopy(), sipver=self.sipver, fr0m=self.getHFBCopy("from"), to=to, via=self.getHFBCopy("via"), callid=self.getHFBCopy("call-id"), cseq=self.getHFBody("cseq").getCSeqNum(), maxforwards=maxforward, user_agent=self.user_agent, ) def genCANCEL(self): maxforwards = self.getHFBodys("max-forwards") if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None return SipRequest( method="CANCEL", ruri=self.ruri.getCopy(), sipver=self.sipver, fr0m=self.getHFBCopy("from"), to=self.getHFBCopy("to"), via=self.getHFBCopy("via"), callid=self.getHFBCopy("call-id"), cseq=self.getHFBody("cseq").getCSeqNum(), maxforwards=maxforward, routes=self.getHFBCopys("route"), target=self.getTarget(), user_agent=self.user_agent, ) def genRequest(self, method, cseq=None): if cseq == None: cseq = self.getHFBody("cseq").getCSeqNum() maxforwards = self.getHFBodys("max-forwards") if len(maxforwards) > 0: maxforward = maxforwards[0].getCopy() else: maxforward = None expires = self.getHFBodys("expires") if len(expires) > 0: expires = expires[0].getCopy() else: expires = None return SipRequest( method=method, ruri=self.ruri.getCopy(), sipver=self.sipver, fr0m=self.getHFBCopy("from"), to=self.getHFBCopy("to"), via=self.getHFBCopy("via"), callid=self.getHFBCopy("call-id"), cseq=cseq, maxforwards=maxforward, user_agent=self.user_agent, expires=expires, )
class SipAddress(object): name = None url = None params = None hadbrace = None transtable = maketrans('-.!%*_+`\'~', 'a' * 10) def __init__(self, address = None, name = None, url = None, params = None, hadbrace = None): self.params = {} self.hadbrace = True if address == None: self.name = name self.url = url if params != None: self.params = params if hadbrace != None: self.hadbrace = hadbrace return # simple 'sip:foo' case if address.lower().startswith('sip:') and address.find('<') == -1: parts = address.split(';', 1) self.url = SipURL(parts[0]) if len(parts) == 2: for l in parts[1].split(';'): if not l: continue k, v = l.split('=') self.params[k] = v self.hadbrace = False return self.name, url = address.split('<', 1) self.name = self.name.strip() if self.name.startswith('"'): self.name = self.name[1:] if self.name.endswith('"'): self.name = self.name[:-1] url, paramstring = url.split('>', 1) self.url = SipURL(url) paramstring = paramstring.strip() if paramstring: for l in paramstring.split(';'): if not l: continue k, v = l.split('=') self.params[k] = v def __str__(self): return self.localStr() def localStr(self, local_addr = None, local_port = None): if self.hadbrace: od = '<' cd = '>' else: od = '' cd = '' s = '' if self.name != None and len(self.name) > 0: if not self.name.translate(self.transtable).isalnum(): s += '"%s" ' % self.name else: s += self.name + ' ' od = '<' cd = '>' s += od + self.url.localStr(local_addr, local_port) + cd for k, v in self.params.items(): s += ';' + k + '=' + v return s def getCopy(self): return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), hadbrace = self.hadbrace) def getParam(self, name): try: return self.params[name] except KeyError: return None def setParam(self, name, value): self.params[name] = value def delParam(self, name): del self.params[name]