我正在使用XE2附带的Indy版本10.5.8.0,并且尝试了四种不同版本的SSL dll.我试过1.0.x的最新版本,以及大约3种不同的0.9.8版本(e,h,x,….).
当您通过calendar.google.com与https://网址进行通信时,它们都不起作用. Delphi Google Calendar组件“Sync-components.com”的作者运送了自己的二进制文件
openssl的DLL运行时没有版本信息,但它似乎是一个非常小,非常老版本的SSL库,比0.9.8更旧.该组件的作者只说他的私有未版本化的DLL是已知的工作.我不敢相信至少有一个版本的openSSL DLL可以很好地与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的世界是一个名副其实的地狱“破坏你,但为我工作”不同的版本.
在Delphi XE2中,使用Indy(或任何其他支持SSL的其他delphi组件库),可以使用SSL连接到Google日历?
或者,如果任何人有一个google日历API实现,与Indy以外的任何其他可以用于测试的工作,我会欣赏链接和指针.
解决方法
问题的实际根本性质似乎是Indy不像我们希望的那样透明地处理HTTP重定向.正在操纵Indy(第三方组件)的代码使用Indy“http redirect”处理逻辑非常难以理解的东西,它似乎是一组解决方法,这些操作不起作用.更令人困惑的是,HTTP重定向代码中的确切位置因测试Google日历的人而异,所以这些重定向故障并不总是出现在测试它们的每个人的同一地点.
请注意,登录方法和方法来获取日历工作.但是,读取事件的方法和代码似乎不起作用.我无法弄清楚两者之间的区别,但我使用的代码是商业的,我不能发布任何内容.我会更新这个消息,如果我已经弄清楚HTTP获取请求的实际技术原因是在其响应中返回“0字节”,就像这样:
https://www.google.com/calendar/Feeds/firstname.lastname%40gmail.com/private/full?max-results=100000
那些零字节的结果是真正的HTTP 302重定向响应代码,我正在使用的代码,没有检查或期望.期待Indy自动处理重定向.
问题可能是Indy10版本是非常具体的,只适用于我今天在我的搜索中没有发现的一个版本的openSSL dll,或者XE2附带的Indy10版本不适用于任何版本的我可以找到的OpenSSL dll,至少不是当它的目标是谷歌的HTTPS日历服务器.
我正在运行的代码使用TIdSSLIOHandlerSocketOpenSSL创建一个IdHTTP对象.
这适用于所有版本的Delphi,包括XE,但由于使用XE2的Indy版本,因此XE2系统因工厂XE2而异.
我找到的唯一的修复是安装一个新的夜间建设的Indy,我抓住了4760,似乎工作正常,当结合OpenSSL dll版本1.0.1.
看起来像我喜欢使用OpenSSL与Delphi XE2有点困难开箱即用.非常感谢Indy团队努力工作….但有人可以帮助他们吗?这真的是一个伟大的项目和一个伟大的产品,但是当它破裂,当你必须遵循移动的标准(如openSSL实现),或许更多的文档,测试和眼球将有所帮助.如果有人能告诉我如何帮助我,我随时准备协助. SSL的问题不是独特的,因为我注意到其他组件供应商和开源人员具有他们支持或不支持的特定版本的OpenSSL dll.
我今天学到的另一件悲伤的事情:OpenSSL的一些安装程序默认安装它们的DLL(无警告)到您的Windows System32目录中,不仅导致您的应用程序,而且还有其他的,如TortoiseHG和TortoiseSVN,可能会中断.如果您在开始播放之前没有使用SSL的大问题,那么如果您从OpenSSL website安装了一堆安装程序版本,您可以轻松使其变得更糟.