222
阿里云
HttpEndpoint 示例代码__Python SDK_SDK使用手册_消息服务-阿里云
这里仅展示HttpEndpoint 部分核心代码,完整的代码请参考 python sdk中simple_http_notify_endpoint.py。
class SimpleHttpNotifyEndpoint(BaseHTTPServer.BaseHTTPRequestHandler):server_version = "SimpleHttpNotifyEndpoint/" + __version__access_log_file = "access_log"msg_type = "XML"def do_POST(self):content_length = int(self.headers.getheader('content-length', 0))self.req_body = self.rfile.read(content_length)self.msg = NotifyMessage()logger.info("Headers:%snBody:%s" % (self.headers, self.req_body))if not self.authenticate():res_code = 403res_content = "Access Forbidden"logger.warning("Access Forbidden!nHeaders:%snReqBody:%sn" % (self.headers, self.req_body))elif not self.validateBody(self.req_body, self.msg, self.msg_type):res_code = 400res_content = "Invalid Notify Message"logger.warning("Invalid Notify Message!nHeaders:%snReqBody:%sn" % (self.headers, self.req_body))else:res_code = 201res_content = ""logger.info("Notify Message Succeed!n%s" % self.msg)self.access_log(res_code)self.response(res_code, res_content)def authenticate(self):#get string to signatureservice_str = "n".join(sorted(["%s:%s" % (k,v) for k,v in self.headers.items() if k.startswith("x-mns-")]))sign_header_list = []for key in ["content-md5", "content-type", "date"]:if key in self.headers.keys():sign_header_list.append(self.headers.getheader(key))else:sign_header_list.append("")str2sign = "%sn%sn%sn%s" % (self.command, "n".join(sign_header_list), service_str, self.path)#verifyauthorization = self.headers.getheader('Authorization')signature = base64.b64decode(authorization)cert_str = urllib2.urlopen(base64.b64decode(self.headers.getheader('x-mns-signing-cert-url'))).read()pubkey = M2Crypto.X509.load_cert_string(cert_str).get_pubkey()pubkey.reset_context(md='sha1')pubkey.verify_init()pubkey.verify_update(str2sign)return pubkey.verify_final(signature)def validateBody(self, data, msg, type):if type == "XML":return self.xml_decode(data, msg)else:msg.message = datareturn Truedef xml_decode(self, data, msg):if data == "":logger.error("Data is "".")return Falsetry:dom = xml.dom.minidom.parseString(data)except Exception, e:logger.error("Parse string fail, exception:%s" % e)return Falsenode_list = dom.getElementsByTagName("Notification")if not node_list:logger.error("Get node of "Notification" fail:%s" % e)return Falsedata_dic = {}for node in node_list[0].childNodes:if node.nodeName != "#text" and node.childNodes != []:data_dic[node.nodeName] = str(node.childNodes[0].nodeValue.strip())key_list = ["TopicOwner", "TopicName", "Subscriber", "SubscriptionName", "MessageId", "MessageMD5", "Message", "PublishTime"]for key in key_list:if key not in data_dic.keys():logger.error("Check item fail. Need "%s"." % key)return Falsemsg.topic_owner = data_dic["TopicOwner"]msg.topic_name = data_dic["TopicName"]msg.subscriber = data_dic["Subscriber"]msg.subscription_name = data_dic["SubscriptionName"]msg.message_id = data_dic["MessageId"]msg.message_md5 = data_dic["MessageMD5"]msg.message_tag = data_dic["MessageTag"] if data_dic.has_key("MessageTag") else ""msg.message = data_dic["Message"]msg.publish_time = data_dic["PublishTime"]return True
最后更新:2016-11-23 16:04:11
上一篇:
主题+QueueEndpoint使用手册__Python SDK_SDK使用手册_消息服务-阿里云
下一篇:
C++ SDK__SDK使用手册_消息服务-阿里云
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云