def strip_secrets(qp, matcher, kwlist):
    """
    This function will scrub the secrets from a query param string based on the passed in matcher and kwlist.

    blah=1&secret=password&valid=true will result in blah=1&secret=<redacted>&valid=true

    You can even pass in path query combinations:

    /signup?blah=1&secret=password&valid=true will result in /signup?blah=1&secret=<redacted>&valid=true

    :param qp: a string representing the query params in URL form (unencoded)
    :param matcher: the matcher to use
    :param kwlist: the list of keywords to match
    :return: a scrubbed query param string
    """
    path = None

    try:
        if qp is None:
            return ''

        if type(kwlist) is not list:
            logger.debug("strip_secrets: bad keyword list")
            return qp

        # If there are no key=values, then just return
        if not '=' in qp:
            return qp

        if '?' in qp:
            path, query = qp.split('?')
        else:
            query = qp

        params = parse.parse_qsl(query, keep_blank_values=True)
        redacted = ['<redacted>']

        if matcher == 'equals-ignore-case':
            for keyword in kwlist:
                for index, kv in enumerate(params):
                    if kv[0].lower() == keyword.lower():
                        params[index] = (kv[0], redacted)
        elif matcher == 'equals':
            for keyword in kwlist:
                for index, kv in enumerate(params):
                    if kv[0] == keyword:
                        params[index] = (kv[0], redacted)
        elif matcher == 'contains-ignore-case':
            for keyword in kwlist:
                for index, kv in enumerate(params):
                    if keyword.lower() in kv[0].lower():
                        params[index] = (kv[0], redacted)
        elif matcher == 'contains':
            for keyword in kwlist:
                for index, kv in enumerate(params):
                    if keyword in kv[0]:
                        params[index] = (kv[0], redacted)
        elif matcher == 'regex':
            for regexp in kwlist:
                for index, kv in enumerate(params):
                    if re.match(regexp, kv[0]):
                        params[index] = (kv[0], redacted)
        else:
            logger.debug("strip_secrets: unknown matcher")
            return qp

        if sys.version_info < (3, 0):
            result = urllib.urlencode(params, doseq=True)
        else:
            result = parse.urlencode(params, doseq=True)
        query = parse.unquote(result)

        if path:
            query = path + '?' + query

        return query
    except:
        logger.debug("strip_secrets", exc_info=True)
def strip_secrets ( qp , matcher , kwlist ) : path = None try : if qp is None : return '' if type ( kwlist ) is not list : logger . debug ( "strip_secrets: bad keyword list" ) return qp if not '=' in qp : return qp if '?' in qp : path , query = qp . split ( '?' ) else : query = qp params = parse . parse_qsl ( query , keep_blank_values = True ) redacted = [ '<redacted>' ] if matcher == 'equals-ignore-case' : for keyword in kwlist : for index , kv in enumerate ( params ) : if kv [ 0 ] . lower ( ) == keyword . lower ( ) : params [ index ] = ( kv [ 0 ] , redacted ) elif matcher == 'equals' : for keyword in kwlist : for index , kv in enumerate ( params ) : if kv [ 0 ] == keyword : params [ index ] = ( kv [ 0 ] , redacted ) elif matcher == 'contains-ignore-case' : for keyword in kwlist : for index , kv in enumerate ( params ) : if keyword . lower ( ) in kv [ 0 ] . lower ( ) : params [ index ] = ( kv [ 0 ] , redacted ) elif matcher == 'contains' : for keyword in kwlist : for index , kv in enumerate ( params ) : if keyword in kv [ 0 ] : params [ index ] = ( kv [ 0 ] , redacted ) elif matcher == 'regex' : for regexp in kwlist : for index , kv in enumerate ( params ) : if re . match ( regexp , kv [ 0 ] ) : params [ index ] = ( kv [ 0 ] , redacted ) else : logger . debug ( "strip_secrets: unknown matcher" ) return qp if sys . version_info < ( 3 , 0 ) : result = urllib . urlencode ( params , doseq = True ) else : result = parse . urlencode ( params , doseq = True ) query = parse . unquote ( result ) if path : query = path + '?' + query return query except : logger . debug ( "strip_secrets" , exc_info = True )
This function will scrub the secrets from a query param string based on the passed in matcher and kwlist.

    blah=1&secret=password&valid=true will result in blah=1&secret=<redacted>&valid=true

    You can even pass in path query combinations:

    /signup?blah=1&secret=password&valid=true will result in /signup?blah=1&secret=<redacted>&valid=true

    :param qp: a string representing the query params in URL form (unencoded)
    :param matcher: the matcher to use
    :param kwlist: the list of keywords to match
    :return: a scrubbed query param string