Я реализую поддержку прокси для приложения OSX.
Я создал собственный NSURLProtocol
, и он отлично работает для прокси без аутентификации. Пробовал и с CCProxy, и с FreeProxy на компьютере с Windows в локальной сети.
Однако, когда включена прокси-аутентификация, любой запрос в первые несколько секунд работает отлично, а затем соединение переходит из состояния ESTABLISHED в CLOSE_WAIT через 5 секунд. Прокси снова показывает 0 подключений и после этого в приложении любой HTTP-запрос получит 407, даже если заголовок proxy-auth предварительно установлен.
Мой код выглядит так:
// set the auth fields
CFStringRef usernameRef = (__bridge CFStringRef)appProxyPrefs.proxyUserName;
CFStringRef passwordRef = (__bridge CFStringRef)appProxyPrefs.proxyPassword;
CFHTTPMessageAddAuthentication(copyOfOriginal, nil, usernameRef, passwordRef, kCFHTTPAuthenticationSchemeBasic, YES);
...
// useless
CFHTTPMessageSetHeaderFieldValue(copyOfOriginal, (__bridge CFStringRef)@"Connection", (CFStringRef)(@"Keep-Alive"));
...
// create stream, callback, schedule
// apply proxy settings to the stream
if (isNoProxyOverride)
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(noProxyDict));
else
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, (__bridge CFTypeRef)(manualProxyDict));
...
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue);
if (!CFReadStreamOpen(myReadStream)) { // error }
else
{
// check if there is a prev stream
if (currentStream != nil)
{
[currentStream close];
currentStream = nil;
}
currentStream = (__bridge NSInputStream *)(myReadStream);
}
Как вы видите, я пытался сохранить предыдущее соединение в статическом потоке ввода и выпускать его только после открытия нового, но это кажется бесполезным.
Также попытался настроить базовый сокет на поддержание активности в kCFStreamEventOpenCompleted
, как это предлагается в NSStream TCP Keep-alive iOS , все еще безуспешно.
Почему соединение закрывается? Как я могу отладить его или заставить его работать? Является ли ошибка соединения прокси-сервером?
Спасибо.
Редактировать 1:
Изменить 2: похоже, это связано с HTTPS... Если я изменю сервер на простой http вместо https, он будет работать отлично.
Proxy-Authorization: Basic
при начальном ПОДКЛЮЧЕНИИ? - person RomanK   schedule 10.03.2015Proxy-Authorization
в CONNECT? Это трудно понять только по названиям пакетов. - person RomanK   schedule 11.03.2015