1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Provides an endpoint for handling storing and retrieving page states."""
6
7import hashlib
8import json
9
10from google.appengine.ext import ndb
11
12from dashboard import request_handler
13from dashboard.models import page_state
14
15
16class ShortUriHandler(request_handler.RequestHandler):
17  """Handles short URI."""
18
19  def get(self):
20    """Handles getting page states."""
21    state_id = self.request.get('sid')
22
23    if not state_id:
24      self.ReportError('Missing required parameters.', status=400)
25      return
26
27    state = ndb.Key(page_state.PageState, state_id).get()
28
29    if not state:
30      self.ReportError('Invalid sid.', status=400)
31      return
32
33    self.response.out.write(state.value)
34
35  def post(self):
36    """Handles saving page states and getting state id."""
37
38    state = self.request.get('page_state')
39
40    if not state:
41      self.ReportError('Missing required parameters.', status=400)
42      return
43
44    state = state.encode('utf-8')
45
46    state_id = GenerateHash(state)
47
48    if not ndb.Key(page_state.PageState, state_id).get():
49      page_state.PageState(id=state_id, value=state).put()
50
51    self.response.out.write(json.dumps({'sid': state_id}))
52
53
54def GenerateHash(state_string):
55  """Generates a hash for a state string."""
56  return hashlib.sha256(state_string).hexdigest()
57