363a1b8912ec840b7c48b380fdd2d363d210c683
[nmhive.git] / nmhive.py
1 #!/usr/bin/env python
2
3 import json
4 import mailbox
5 import tempfile
6 import urllib.request
7
8 import flask
9 import flask_cors
10
11
12 app = flask.Flask(__name__)
13 flask_cors.CORS(app)
14
15
16 _AVAILABLE_TAGS = {
17     'bug',
18     'needs-review',
19     'obsolete',
20     'patch',
21     }
22 _TAGS = {}
23
24
25 @app.route('/tags', methods=['GET'])
26 def tags():
27     return flask.Response(
28         response=json.dumps(sorted(_AVAILABLE_TAGS)),
29         mimetype='application/json')
30
31
32 @app.route('/mid/<message_id>', methods=['GET', 'POST'])
33 def message_id_tags(message_id):
34     if flask.request.method == 'POST':
35         tags = _TAGS.get(message_id, set())
36         new_tags = tags.copy()
37         for change in flask.request.get_json():
38             if change.startswith('+'):
39                 new_tags.add(change[1:])
40             elif change.startswith('-'):
41                 try:
42                     new_tags.remove(change[1:])
43                 except KeyError:
44                     return flask.Response(status=400)
45             else:
46                 return flask.Response(status=400)
47         _TAGS[message_id] = new_tags
48         return flask.Response(
49             response=json.dumps(sorted(new_tags)),
50             mimetype='application/json')
51     elif flask.request.method == 'GET':
52         try:
53             tags = _TAGS[message_id]
54         except KeyError:
55             return flask.Response(status=404)
56         return flask.Response(
57             response=json.dumps(sorted(tags)),
58             mimetype='application/json')
59
60
61 @app.route('/gmane/<group>/<int:article>', methods=['GET'])
62 def gmane_message_id(group, article):
63     url = 'http://download.gmane.org/{}/{}/{}'.format(
64         group, article, article + 1)
65     response = urllib.request.urlopen(url=url, timeout=3)
66     mbox_bytes = response.read()
67     with tempfile.NamedTemporaryFile(prefix='nmbug-', suffix='.mbox') as f:
68         f.write(mbox_bytes)
69         mbox = mailbox.mbox(path=f.name)
70         _, message = mbox.popitem()
71         message_id = message['message-id']
72     return flask.Response(
73         response=message_id.lstrip('<').rstrip('>'),
74         mimetype='text/plain')
75
76
77 if __name__ == '__main__':
78     app.debug = True
79     app.run(host='0.0.0.0')