docs: def request(self, path, params=None, returns_json=True,
                  method='POST', api_version=API_VERSION):
          '''Process a request using the OAuth client's request method.
  
          :param str path: Path fragment to the API endpoint, e.g. "resource/ID"
          :param dict params: Parameters to pass to request
          :param str method: Optional HTTP method, normally POST for Instapaper
          :param str api_version: Optional alternative API version
          :returns: response headers and body
          :retval: dict
          '''
          time.sleep(REQUEST_DELAY_SECS)
          full_path = '/'.join([BASE_URL, 'api/%s' % api_version, path])
          params = urlencode(params) if params else None
          log.debug('URL: %s', full_path)
          request_kwargs = {'method': method}
          if params:
              request_kwargs['body'] = params
          response, content = self.oauth_client.request(
              full_path, **request_kwargs)
          log.debug('CONTENT: %s ...', content[:50])
          if returns_json:
              try:
                  data = json.loads(content)
                  if isinstance(data, list) and len(data) == 1:
                      # ugly -- API always returns a list even when you expect
                      # only one item
                      if data[0]['type'] == 'error':
                          raise Exception('Instapaper error %d: %s' % (
                              data[0]['error_code'],
                              data[0]['message'])
                          )
                      # TODO: PyInstapaperException custom class?
              except ValueError:
                  # Instapaper API can be unpredictable/inconsistent, e.g.
                  # bookmarks/get_text doesn't return JSON
                  data = content
          else:
              data = content
          return {
              'response': response,
              'data': data
          }