docs: def request(self, req_and_resp, opt=None, headers=None):
          """ preprocess before performing a request, usually some patching.
          authorization also applied here.
  
          :param req_and_resp: tuple of Request and Response
          :type req_and_resp: (Request, Response)
          :param opt: customized options
          :type opt: dict
          :param headers: customized headers
          :type headers: dict of 'string', or list of tuple: (string, string) for multiple values for one key
          :return: patched request and response
          :rtype: Request, Response
          """
          req, resp = req_and_resp
  
          # dump info for debugging
          logger.info('request.url: {0}'.format(req.url))
          logger.info('request.header: {0}'.format(req.header))
          logger.info('request.query: {0}'.format(req.query))
          logger.info('request.file: {0}'.format(req.files))
          logger.info('request.schemes: {0}'.format(req.schemes))
  
          # apply authorizations
          if self.__security:
              self.__security(req)
  
          return req, resp