@@ -119,10 +119,20 @@ - (OFDictionary*)headers { OF_GETTER(headers, YES) } + +- (void)setRedirectsFromHTTPSToHTTPAllowed: (BOOL)allowed +{ + redirectsFromHTTPSToHTTPAllowed = allowed; +} + +- (BOOL)redirectsFromHTTPSToHTTPAllowed +{ + return redirectsFromHTTPSToHTTPAllowed; +} - (OFHTTPRequestResult*)perform { return [self performWithRedirects: 10]; } @@ -255,13 +265,16 @@ tmp++; } while (*tmp == ' '); value = [OFString stringWithCString: tmp]; - if (redirects > 0 && (status == 301 || status == 302 || + if ((redirects > 0 && (status == 301 || status == 302 || status == 303) && [key caseInsensitiveCompare: - @"Location"] == OF_ORDERED_SAME) { + @"Location"] == OF_ORDERED_SAME) && + (redirectsFromHTTPSToHTTPAllowed || + [scheme isEqual: @"http"] || + ![value hasPrefix: @"http://"])) { OFURL *new; new = [[OFURL alloc] initWithString: value relativeToURL: URL]; [URL release];