code: def _normalize_request_parameters(self, oauth_params, req_kwargs):
          '''
          This process normalizes the request parameters as detailed in the OAuth
          1.0 spec.
          Additionally we apply a `Content-Type` header to the request of the
          `FORM_URLENCODE` type if the `Content-Type` was previously set, i.e. if
          this is a `POST` or `PUT` request. This ensures the correct header is
          set as per spec.
          Finally we sort the parameters in preparation for signing and return
          a URL encoded string of all normalized parameters.
          :param oauth_params: OAuth params to sign with.
          :type oauth_params: dict
          :param req_kwargs: Request kwargs to normalize.
          :type req_kwargs: dict
          '''
          normalized = []
          params = req_kwargs.get('params', {})
          data = req_kwargs.get('data', {})
          headers = req_kwargs.get('headers', {})
          for k, v in params.items():
              if v is not None:
                  normalized += [(k, v)]
          if 'Content-Type' in headers and \
                  headers['Content-Type'] == FORM_URLENCODED:
              for k, v in data.items():
                  normalized += [(k, v)]
          all_normalized = []
          for t in normalized:
              k, v = t
              if is_basestring(v) and not isinstance(v, bytes):
                  v = v.encode('utf-8')
              all_normalized += [(k, v)]
          for k, v in oauth_params.items():
              if (k, v) in all_normalized:
                  continue
              all_normalized += [(k, v)]
          all_normalized.sort()
          return urlencode(all_normalized, True)\
              .replace('+', '%20')\
              .replace('%7E', '~')