docs: def dorequest(self, request_dic, opname):
          """
          :param request_dic: a dictionary containing parameters for the request
          :param opname: An API operation name, available are: loginUser,getInitialUserData,logoutUser,createNewBudget,
          freshStartABudget,cloneBudget,deleteTombstonedBudgets,syncCatalogData,syncBudgetData,getInstitutionList,
          getInstitutionLoginFields,getInstitutionAccountList,registerAccountForDirectConnect,
          updateDirectConnectCredentials,poll,createFeedback,runSqlStatement
          :return: the dictionary of the result of the request
          """
          # Available operations :
  
          def curate_password(message):
              return message.replace(self.password, '********')
  
          def errorout(message):
              LOG.error(curate_password(message))
              raise NYnabConnectionError(message)
  
          json_request_dict = json.dumps(request_dic, cls=ComplexEncoder)
          params = {u'operation_name': opname, 'request_data': json_request_dict}
          LOG.debug(curate_password('%s  ... %s ' % (opname, params)))
          r = self.session.post(self.urlCatalog, params)
          self.lastrequest_elapsed = r.elapsed
          js = r.json()
          if r.status_code == 500:
              errorout('Unrecoverable server error, sorry YNAB')
          if r.status_code != 200:
              LOG.debug('non-200 HTTP code: %s ' % r.text)
          if not 'error' in js:
              errorout('The server returned a json value without an error field')
          if js['error'] is None:
              LOG.debug(curate_password('the server returned '+pp_json(js)))
              return js
          error = js['error']
          if 'id' not in error:
              errorout('Error field %s without id returned from the API, %s' % (error, params))
          if error['id'] == 'user_not_found':
              errorout('API error, User Not Found')
          elif error['id'] == 'user_password_invalid':
              errorout('API error, User-Password combination invalid')
          elif error['id'] == 'request_throttled':
              LOG.debug('API Rrequest throttled')
              retryrafter = r.headers['Retry-After']
              LOG.debug('Waiting for %s s' % retryrafter)
              sleep(float(retryrafter))
              return self.dorequest(request_dic, opname)
          elif error['id'] == 'invalid_session_token':
              errorout('Invalid session token. You should call init_session() on the connection object')
          else:
              errorout('Unknown API Error \"%s\" was returned from the API when sending request (%s)' % (error['id'], params))