Decodes a HttpBL response IP and return data structure of response
        data.

        :param ip_address: IP address to query
        :type ip_address: str
        :rtype: dict
        :raises: ValueError

def _decode_response(self, ip_address):
        """Decodes a HttpBL response IP and return data structure of response
        data.

        :param ip_address: IP address to query
        :type ip_address: str
        :rtype: dict
        :raises: ValueError

        """
        # Reverse the IP, reassign the octets to integers
        vt, ts, days, rc = [int(o) for o in ip_address.split('.')[::-1]]

        # 127 reflects a valid query response, all others are errors
        if rc != 127:
            raise ValueError('Invalid Response Code: {}'.format(rc))

        # Build a list of visitor types since one IP can be multiple
        visitor_types = []
        if vt & COMMENT_SPAMMER:
            visitor_types.append(COMMENT_SPAMMER)
        if vt & HARVESTER:
            visitor_types.append(HARVESTER)
        if vt & SUSPICIOUS:
            visitor_types.append(SUSPICIOUS)

        # Return the response dictionary
        return {'days_since_last_activity': days if vt else None,
                'name': None if vt else SEARCH_ENGINES[ts],
                'threat_score': ts if vt else None,
                'type': visitor_types if vt else [SEARCH_ENGINE]}