Skip to content

Commit 39319f5

Browse files
author
chenfeng2
committed
Update apibus handlers
1 parent 3643251 commit 39319f5

File tree

3 files changed

+54
-48
lines changed

3 files changed

+54
-48
lines changed

examples/apibus/README

Lines changed: 0 additions & 1 deletion
This file was deleted.

examples/apibus/apibus_handler.py

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,84 @@
11
#-*-coding: utf8 -*-
22

33
"""
4-
urllib2 handler for SAE APIBus Service
4+
SAE API auth handler for urllib2 and requests
55
6-
Usage:
6+
urllib2:
77
8-
import urllib2
9-
from apibus_handler import APIBusHandler
10-
opener = urllib2.build_opener(APIBusHandler(ACCESSKEY, SECRETKEY))
8+
>>> import urllib2
9+
>>> apibus_handler = SaeApibusAuthHandler(ACCESSKEY, SECRETKEY)
10+
>>> opener = urllib2.build_opener(apibus_handler)
11+
>>> print opener.open('http://g.sae.sina.com.cn/log/http/2015-06-18/1-access.log').read()
1112
12-
Then you can use *opener* to request sae internal service such as segement,
13-
sms as you want.
13+
requests:
14+
15+
>>> import requests
16+
>>> print requests.get('http://g.sae.sina.com.cn/log/http/2015-06-18/1-access.log?head/0/10|fields/ /1/2/3/4', auth=SaeApibusAuth(ACCESSKEY, SECRETKEY)).content
1417
"""
1518

1619
import hmac
1720
import base64
1821
import hashlib
1922
import time
23+
import urllib
2024
from urllib2 import BaseHandler, Request
2125

22-
_APIBUS_ENDPOINT = 'http://g.apibus.io'
26+
_APIBUS_URL_PREFIX = 'http://g.sae.sina.com.cn/'
2327

24-
class APIBusHandler(BaseHandler):
28+
class SaeApibusAuthHandler(BaseHandler):
2529
# apibus handler must be in front
2630
handler_order = 100
2731

2832
def __init__(self, accesskey, secretkey):
2933
self.accesskey = accesskey
3034
self.secretkey = secretkey
3135

32-
def _signature(self, headers):
33-
msg = ''.join([k + v for k, v in headers])
34-
h = hmac.new(self.secretkey, msg, hashlib.sha256).digest()
35-
return base64.b64encode(h)
36-
3736
def http_request(self, req):
3837
orig_url = req.get_full_url()
38+
if not orig_url.startswith(_APIBUS_URL_PREFIX):
39+
return req
40+
3941
timestamp = str(int(time.time()))
4042
headers = [
41-
('Fetchurl', orig_url),
42-
('Timestamp', timestamp),
43-
('Accesskey', self.accesskey),
43+
('x-sae-timestamp', timestamp),
44+
('x-sae-accesskey', self.accesskey),
4445
]
45-
headers.append(('Signature', self._signature(headers)))
46-
# Create a new request
47-
_req = Request(_APIBUS_ENDPOINT, req.get_data(), origin_req_host=orig_url)
48-
_req.headers.update(req.header_items())
49-
_req.headers.update(headers)
50-
_req.timeout = req.timeout
51-
return _req
46+
req.headers.update(headers)
47+
48+
method = req.get_method()
49+
resource = urllib.unquote(req.get_full_url()[len(_APIBUS_URL_PREFIX)-1:])
50+
sae_headers = [(k.lower(), v.lower()) for k, v in req.headers.items() if k.lower().startswith('x-sae-')]
51+
req.add_header('Authorization', _signature(self.secretkey, method, resource, sae_headers))
52+
return req
5253

5354
https_request = http_request
5455

56+
try:
57+
from requests.auth import AuthBase
58+
59+
class SaeApibusAuth(AuthBase):
60+
"""Attaches HTTP Basic Authentication to the given Request object."""
61+
def __init__(self, accesskey, secretkey):
62+
self.accesskey = accesskey
63+
self.secretkey = secretkey
64+
65+
def __call__(self, r):
66+
timestamp = str(int(time.time()))
67+
r.headers['x-sae-timestamp'] = timestamp
68+
r.headers['x-sae-accesskey'] = self.accesskey
69+
resource = urllib.unquote(r.url[len(_APIBUS_URL_PREFIX)-1:])
70+
#resource = r.url[len(_APIBUS_URL_PREFIX)-1:]
71+
sae_headers = [(k.lower(), v.lower()) for k, v in r.headers.items() if k.lower().startswith('x-sae-')]
72+
r.headers['Authorization'] = _signature(self.secretkey, r.method, resource, sae_headers)
73+
return r
74+
except ImportError:
75+
# requests was not present!
76+
pass
77+
78+
def _signature(secret, method, resource, headers):
79+
msgToSign = "\n".join([
80+
method, resource,
81+
"\n".join([(k + ":" + v) for k, v in sorted(headers)]),
82+
])
83+
return "SAEV1_HMAC_SHA256 " + base64.b64encode(hmac.new(secret, msgToSign, hashlib.sha256).digest())
84+

examples/apibus/demo.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)