Ответ 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 сайт.