Чтение результатов прокси CFNetwork напрямую в C++
Используйте C-API поиска прокси от Apple из C++ и держите заимствованные значения словарей живыми, не освобождая их как принадлежащие вам объекты.
Поиск прокси в CFNetwork — это C-API, которое можно использовать напрямую из C++; преобразовывать всё в объекты Objective-C необязательно. Вызовите CFNetworkCopyProxiesForURL с целевым CFURL и настройками из CFNetworkCopySystemProxySettings, чтобы получить упорядоченные словари прокси.
| Значение | Владение |
|---|---|
| Объекты, созданные или возвращённые Copy, включая маршруты и настройки | Принадлежат вызывающему; освобождайте каждый принадлежащий объект, не равный null |
| Словарь из массива или имя хоста из словаря через Get | Заимствовано; не освобождайте, предварительно не сохранив владение |
Для корректных routes и индекса в допустимом диапазоне извлечение может выглядеть так:
CFDictionaryRef proxy = static_cast<CFDictionaryRef>(
CFArrayGetValueAtIndex(routes, index));
CFStringRef hostname = static_cast<CFStringRef>(
CFDictionaryGetValue(proxy, kCFProxyHostNameKey));
Прочитайте kCFProxyTypeKey, прежде чем рассматривать запись как конечную точку. Прямые кандидаты и кандидаты автоматической конфигурации требуют разной обработки.
Преобразуйте имя хоста CFString и порт CFNumber конкретной записи, пока владелец жив. Извлечённые значения C++ затем могут попасть в конфигурацию транспорта. Чтобы сохранить сам CFString после результата, сначала сохраните его, а затем уравновесьте это с помощью CFRelease; иначе завершите работу до освобождения содержащего его владельца.
При очистке освободите созданный/скопированный целевой URL, словарь настроек и массив результатов, используя при необходимости защиту области видимости. Один лишь тип CFStringRef переменной не даёт владения результатом Get.