code: def send_request(self, request):
          
          # default to an empty response error
          res = APIEmptyResponseErrorResponse()
  
          # perform the request
          log.debug("Client sending request: " + str(request))
          response = self.session.post(self.url, data=str(request))
          data = response.text
          if response.status_code != 200:
              res = APIGenericErrorResponse(response.text)
          elif data and len(data) > 0:
              log.debug('Client received message: ' + data)
  
              try:
                  # parse the response data
                  generic_response = APIResponse(data=data)
  
                  # if there's an error, return an error response
                  if generic_response.is_error:
                      res = APIErrorResponse(data=data)
                  else:
                      # success; generate a proper response
                      plugin = voltron.plugin.pm.api_plugin_for_request(request.request)
                      if plugin and plugin.response_class:
                          # found a plugin for the request we sent, use its response type
                          res = plugin.response_class(data=data)
                      else:
                          # didn't find a plugin, just return the generic APIResponse we already generated
                          res = generic_response
              except Exception as e:
                  log.exception('Exception parsing message: ' + str(e))
                  log.error('Invalid message: ' + data)
          else:
              res = APIEmptyResponseErrorResponse()
  
          return res
docs: Send a request to the server.
  
          `request` is an APIRequest subclass.
  
          Returns an APIResponse or subclass instance. If an error occurred, it
          will be an APIErrorResponse, if the request was successful it will be
          the plugin's specified response class if one exists, otherwise it will
          be an APIResponse.