+ log_error(LOG_LEVEL_REDIRECTS,
+ "Checking \"%s\" for encoded redirects.", subject);
+
+#if defined(MUTEX_LOCKS_AVAILABLE) && defined(HAVE_STRTOK)
+ /*
+ * Check each parameter in the URL separately.
+ * Sectionize the URL at "?" and "&",
+ * then URL-decode each component,
+ * and look for a URL in the decoded result.
+ * Keep the last one we spot.
+ */
+ char *found = NULL;
+
+ privoxy_mutex_lock(&strtok_mutex);
+ char *token = strtok(subject, "?&");
+ while (token)
+ {
+ char *dtoken = url_decode(token);
+ if (NULL == dtoken)
+ {
+ log_error(LOG_LEVEL_ERROR, "Unable to decode \"%s\".", token);
+ continue;
+ }
+ char *h1 = strstr(dtoken, "http://");
+ char *h2 = strstr(dtoken, "https://");
+ char *h = (h1 && h2
+ ? (h1 < h2 ? h1 : h2)
+ : (h1 ? h1 : h2));
+ if (h)
+ {
+ freez(found);
+ found = strdup(h);
+ if (found == NULL)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Out of memory while searching for redirects.");
+ privoxy_mutex_unlock(&strtok_mutex);
+ return NULL;
+ }
+ }
+ freez(dtoken);
+ token = strtok(NULL, "?&");
+ }
+ privoxy_mutex_unlock(&strtok_mutex);
+ freez(subject);
+
+ return found;
+#else