-const char filters_rcs[] = "$Id: filters.c,v 1.66 2006/09/23 13:26:38 roro Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.69 2006/12/08 12:39:13 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
*
* Revisions :
* $Log: filters.c,v $
+ * Revision 1.69 2006/12/08 12:39:13 fabiankeil
+ * Let get_last_url() catch https URLs as well.
+ *
+ * Revision 1.68 2006/12/05 14:45:48 fabiankeil
+ * Make sure get_last_url() behaves like advertised
+ * and fast-redirects{} can be combined with redirect{}.
+ *
+ * Revision 1.67 2006/11/28 15:19:43 fabiankeil
+ * Implemented +redirect{s@foo@bar@} to generate
+ * a redirect based on a rewritten version of the
+ * original URL.
+ *
* Revision 1.66 2006/09/23 13:26:38 roro
* Replace TABs by spaces in source code.
*
*********************************************************************/
char *get_last_url(char *subject, const char *redirect_mode)
{
- char *new_url;
+ char *new_url = NULL;
char *tmp;
assert(subject);
assert(redirect_mode);
subject = strdup(subject);
+ if (subject == NULL)
+ {
+ log_error(LOG_LEVEL_ERROR, "Out of memory while searching for redirects.");
+ return NULL;
+ }
if (0 == strcmpic(redirect_mode, "check-decoded-url"))
{
log_error(LOG_LEVEL_REDIRECTS, "Decoding \"%s\" if necessary.", subject);
new_url = url_decode(subject);
- freez(subject);
- subject = new_url;
+ if (new_url != NULL)
+ {
+ freez(subject);
+ subject = new_url;
+ }
+ else
+ {
+ log_error(LOG_LEVEL_ERROR, "Unable to decode \"%s\".", subject);
+ }
}
- log_error(LOG_LEVEL_REDIRECTS, "Checking \"%s\" for redirects", subject);
+ log_error(LOG_LEVEL_REDIRECTS, "Checking \"%s\" for redirects.", subject);
/*
* Find the last URL encoded in the request
{
new_url = tmp++;
}
+ tmp = (new_url != NULL) ? new_url : subject;
+ while ((tmp = strstr(tmp, "https://")) != NULL)
+ {
+ new_url = tmp++;
+ }
- if (new_url != subject)
+ if ((new_url != NULL)
+ && ( (new_url != subject)
+ || (0 == strncmpic(subject, "http://", 7))
+ || (0 == strncmpic(subject, "https://", 8))
+ ))
{
+ /*
+ * Return new URL if we found a redirect
+ * or if the subject already was a URL.
+ *
+ * The second case makes sure that we can
+ * chain get_last_url after another redirection check
+ * (like rewrite_url) without losing earlier redirects.
+ */
new_url = strdup(new_url);
freez(subject);
return new_url;