Home | History | Annotate | Download | only in client_lib
      1 # Copyright 2014 The Chromium OS 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 """Module contains a simple client lib to the commands RPC."""
      6 
      7 import logging
      8 import urllib2
      9 
     10 
     11 class CommonClient(object):
     12     """Common client class."""
     13 
     14     _DEFAULT_SERVER_URL = 'http://localhost:9876'
     15     _URL = '%(server_url)s/%(method)s'
     16 
     17 
     18     def __init__(self, method, server_url=_DEFAULT_SERVER_URL, api_key=None,
     19                  access_token=None,):
     20         """
     21         @param method: REST method to call e.g. my_method/call
     22         @param server_url: Base url for the server e.g. http://localhost:8080
     23         @param api_key: API key to use with remote server.
     24         @param access_token: Access token to use to interact with server.
     25         """
     26         self._method = method
     27         self.server_url = server_url
     28         self.api_key = api_key
     29         self.access_token = access_token
     30 
     31 
     32     def add_auth_headers(self, additional_headers=None):
     33         """Returns combined auth headers with any additional headers.
     34 
     35         @param additional_headers: Additional headers to use.
     36         """
     37         if not self.access_token:
     38             return additional_headers if additional_headers else {}
     39         else:
     40             headers = {'Authorization': self.access_token}
     41             if additional_headers:
     42                 headers.update(additional_headers)
     43 
     44             return headers
     45 
     46 
     47     def get_url(self, paths=[], params={}):
     48         """Returns url to use to talk to the server method.
     49 
     50         @param paths: Parts of a path to append to base url.
     51         @param params: Dictionary of url parameters.
     52         """
     53         if not self._method:
     54             raise NotImplementedError('method not defined.')
     55 
     56         # Create the method string.
     57         paths_str = ''
     58         if paths:
     59             paths_str = '/' + '/'.join([str(p) for p in paths])
     60 
     61         # Create the query string.
     62         params_str = ''
     63         if not params:
     64             params = {}
     65 
     66         if self.api_key:
     67             params.setdefault('key', self.api_key)
     68 
     69         params_list = []
     70         for kw, arg in params.iteritems():
     71             params_list.append('='.join([urllib2.quote(kw),
     72                                          urllib2.quote(arg)]))
     73 
     74         if params_list:
     75             params_str = '?' + '&'.join(params_list)
     76 
     77         url = self._URL % dict(
     78                 server_url=self.server_url,
     79                 method=self._method) + paths_str + params_str
     80 
     81         logging.info("Returning url: %s to use.", url)
     82         return url
     83