Как я могу заставить Delphi XE2 поговорить с API-интерфейсом Google Calendar через SSL?

Это время для этого вопроса, но на этот раз с Delphi XE2.

Я использую версию Indy 10.5.8.0, которая поставляется с XE2, и я пробовал четыре разные версии SSL-dll. Я пробовал 1.0.x последние и около 3 разных версий 0.9.8 (e, h, x,....).

Ни один из них не работает при общении с https://URL на странице calendar.google.com. Автор компонента "Календарь Google Delphi Google" в Sync-components.com" отправляет свой собственный двоичный файл openssl DLL, которые не имеют в нем никакой информации о версии, но это, по-видимому, очень маленькая, очень старая версия SSL-библиотек старше 0.9.8. Автор компонента говорит, что работают только его частные неверующие библиотеки DLL. Я не могу в это поверить. Разумеется, хотя бы одна версия DLL openSSL работает достаточно хорошо, чтобы Delphi XE2 подключился к Календарю Google.

Чтобы загрузить свою обычную старую DLL для загрузки в Indy 10 в Delphi XE2, он модифицирует метод IdSSLOpenHeaders.pas Load, как это, в конце:

 function Load: Boolean;
 begin
   /// ... lots of stuff
   //Result := (FFailedFunctionLoadList.Count = 0); // original.
   Result := (FFailedFunctionLoadList.Count <= 18); // changed to.
 end;

Конечно, компонент, который я оцениваю, не работает в XE2, но я подозреваю, что это нарушение (a) данного моментального снимка Indy 10, который поставляется с XE2, или (b) тот факт, что мир SSL DLL - это настоящий ад, "сломанный для вас, но работает для меня" в разных версиях.

Что мне нужно сделать, чтобы получить SSL-соединение с Календарем Google, используя Indy (или любую другую библиотеку компонентов Delphi с поддержкой SSL) в Delphi XE2?

В качестве альтернативы, если у кого-то есть реализация API календаря Google, которая работает с чем-то другим, кроме Indy, который я мог бы использовать для тестирования, я был бы признателен за ссылки и указатели.

Ответы

Ответ 1

Что-то не так с моментальным снимком Indy10, который поставляется с XE2, поскольку объект idHTTP не работает хорошо с любой из DLL OpenSSL, я обнаружил, что я не мог общаться с какими-либо сервисами сервера календаря Google с ними.

Фактическая основная проблема проблемы заключается в том, что Indy не обрабатывает перенаправления HTTP как прозрачно, как мы могли бы надеяться. Код, который манипулирует Indy (сторонним компонентом), действительно трудно понять, что происходит с логикой обработки данных "http redirect" Indy, которая представляет собой набор обходных решений, которые не работают. Более того, запутанность заключается в том, что точные места в коде, в котором происходят перенаправления HTTP, варьируются от одного человека, проверяющего Google Календари, к другому, поэтому эти переадресационные сбои не всегда появляются в тех же местах для каждого, кто его тестирует.

Обратите внимание, что метод входа и метод работы календарей. Но методы и код, предназначенные для чтения событий, похоже, не работают. Мне не удалось выяснить разницу между ними, но код, который я использую, является коммерческим, и я не могу опубликовать его. Я обновлю это сообщение, если я когда-нибудь выясню фактическую техническую причину, по которой запрос HTTP-запроса возвращал "0 байт" в ответ на такие URL-адреса:

https://www.google.com/calendar/feeds/firstname.lastname%40gmail.com/private/full?max-results=100000

Те результаты с нулевым байтом были действительно HTTP-кодом ответа HTTP 302, который использовался мной кодом, не проверял или не ожидал. Он ожидал, что Indy автоматически обработает перенаправления.

Проблема может заключаться в том, что версия Indy10 очень специфична и работает только с версией DLL openSSL, которую я не обнаружил в моем поиске сегодня, или что версия Indy10, поставляемая с XE2, не работает с ЛЮБАЯ версия DLL OpenSSL, которую я мог найти, по крайней мере, не тогда, когда целью, с которой она разговаривает, являются серверы календаря Google HTTPS.

Код, который я запускаю, создает объект IdHTTP с TIdSSLIOHandlerSocketOpenSSL.

Это работает во всех версиях Delphi до XE, включая XE, но ломается с системой factory XE2, из-за доставки версии Indy с XE2.

Единственное исправление, которое я нашел, - это установить новую ночную сборку Indy, я захватил 4760, которая, кажется, работает нормально, в сочетании с DLL версии 1.0.1.

Мне кажется, что использование OpenSSL с Delphi XE2 немного сложнее из коробки. Огромное спасибо команде Indy за упорную работу... Но может кто-то помочь им? Это действительно отличный проект и отличный продукт, но когда он ломается, и когда вам нужно следовать движущемуся стандарту (например, реализация openSSL), возможно, потребуется немного больше документации, а также тестирование и глазные яблоки. Я готов помочь, если кто-нибудь может показать мне, как я могу помочь. Проблемы с SSL не являются индивидуальными, поскольку я замечаю, что другие поставщики компонентов и люди с открытым исходным кодом имеют определенные версии DLL OpenSSL, которые они поддерживают или не поддерживают.

Другие печальные вещи, которые я узнал сегодня: некоторые из установщиков из OpenSSL устанавливают свои DLL по умолчанию (без предупреждения) в ваш каталог Windows System32, вызывая не только ваше приложение, но и другие, такие как TortoiseHG и TortoiseSVN, возможно, сломаться. Если у вас не было большой проблемы с SSL, прежде чем вы начали играть, вы могли бы сделать это хуже, если вы установили кучу версий-установщиков из OpenSSL сайт.