2012-05-30 16 views
14

Đã đến lúc this question một lần nữa, nhưng lần này với Delphi XE2.Tôi làm cách nào để có được Delphi XE2 để nói chuyện với API Lịch Google qua SSL?

Tôi đang sử dụng phiên bản Indy 10.5.8.0 có gắn với XE2 và tôi đã thử bốn phiên bản khác nhau của các tệp SSL. Tôi đã thử phiên bản 1.0.x mới nhất và khoảng 3 phiên bản 0.9.8 khác nhau (e, h, x, ....).

Không ai trong số họ hoạt động, khi liên lạc với https: // url tại calendar.google.com. Tác giả của thành phần Lịch Google Delphi tại "Sync-components.com" tự phân phối các tệp nhị phân của riêng mình openssl DLL runtimes không có thông tin phiên bản trong đó, nhưng nó có vẻ là một phiên bản rất nhỏ, cũ của thư viện SSL cũ hơn 0.9.8. Tác giả của thành phần này chỉ nói rằng các DLL không phiên bản riêng của anh ta được biết là hoạt động. Tôi không thể tin được. Chắc chắn ít nhất một phiên bản của các dll openSSL hoạt động tốt với Delphi XE2 để kết nối với Lịch Google.

Để có được DLL tục cổ xưa của mình để nạp vào Indy 10 trong Delphi XE2, ông sẽ thay đổi phương thức Load IdSSLOpenHeaders.pas, như thế này, ở cuối:

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

Tất nhiên, thành phần mà tôi am đánh giá không hoạt động trong XE2, nhưng tôi nghi ngờ đó là sự hư hỏng của một trong hai (a) này đặc biệt ảnh chụp của Indy 10 tàu với XE2, hoặc (b) thực tế là thế giới của SSL DLLs là một địa ngục thật sự của "bị hỏng cho bạn nhưng làm việc cho tôi "các phiên bản khác nhau.

Tôi phải làm gì để nhận kết nối SSL với Lịch Google, sử dụng Indy (hoặc bất kỳ thư viện thành phần delphi nào khác có hỗ trợ SSL), trong Delphi XE2?

Ngoài ra, nếu có ai có cài đặt API lịch Google hoạt động với bất kỳ thứ gì khác ngoài Indy mà tôi có thể sử dụng để thử nghiệm, tôi sẽ đánh giá cao các liên kết và con trỏ.

+1

Nếu bạn có ngân sách, hãy xem [SecureBlackBox] (http://www.eldos.com/). Họ có một phiên bản dùng thử đầy đủ chức năng. –

+0

Họ cung cấp hỗ trợ https chung nhưng không phải là bản demo API Lịch Google khiến tôi tự hỏi liệu có một số điều lạ với tùy chọn auth HTTPS của lịch Google hay không, vì đó là những gì tôi hỏi: Không chỉ SSL, mà là máy chủ GOOGLE ssl. –

Trả lời

6

Có điều gì đó sai với ảnh chụp Indy10 đi cùng với XE2, trong đó đối tượng idHTTP dường như không hoạt động tốt với bất kỳ tệp OpenSSL nào tôi tìm thấy, trong đó tôi không thể kết nối với bất kỳ dịch vụ máy chủ Lịch Google nào chúng.

Bản chất cơ bản thực sự của vấn đề dường như là Indy không xử lý chuyển hướng HTTP như minh bạch như chúng ta có thể đã hy vọng. Mã điều khiển Indy (thành phần của bên thứ ba) thực sự khó hiểu những thứ với logic xử lý "chuyển hướng http" của Indy dường như là một tập hợp các cách giải quyết, không hoạt động. Hơn nữa, điều khó hiểu hơn là các vị trí chính xác trong mã nơi các chuyển hướng HTTP xảy ra thay đổi từ một người kiểm tra Lịch Google, đến một lịch khác, vì vậy những trục trặc chuyển hướng này không xuất hiện ở cùng một nơi cho mỗi người kiểm tra nó.

Lưu ý rằng phương thức đăng nhập và phương thức để lịch được làm việc. Nhưng các phương pháp và mã đã đọc các sự kiện, dường như không hoạt động. Tôi đã không thể tìm ra sự khác biệt giữa hai, nhưng mã tôi đang sử dụng là thương mại và tôi không thể đăng bất kỳ của nó. Tôi sẽ cập nhật thông báo này nếu tôi đã từng tìm ra lý do kỹ thuật thực tế rằng HTTP được yêu cầu được trở về "0 byte" trong phản ứng của nó đối với các url như thế này:

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

Những zero byte kết quả đã thực sự chuyển hướng HTTP 302 phản ứng mã mà tôi đang sử dụng, không kiểm tra hoặc mong đợi. Người ta hy vọng Indy sẽ tự động xử lý các chuyển hướng.

Sự cố có thể là phiên bản Indy10 rất cụ thể và chỉ hoạt động với phiên bản của dll openSSL mà tôi không tìm thấy trong tìm kiếm hôm nay hoặc phiên bản Indy10 đi cùng XE2 không hoạt động với BẤT CỨ phiên bản của các dll OpenSSL mà tôi có thể tìm thấy, ít nhất là khi mục tiêu mà nó đang nói đến là các máy chủ lịch HTTPS của google.

Mã tôi đang chạy tạo đối tượng IdHTTP bằng TIdSSLIOHandlerSocketOpenSSL.

Điều này làm việc trong tất cả các phiên bản của Delphi lên đến và bao gồm XE, nhưng phá vỡ với một hệ thống XE2 nhà máy, do vận chuyển phiên bản Indy với XE2.

Sửa lỗi duy nhất tôi tìm thấy là cài đặt bản dựng hàng đêm mới của Indy, tôi đã giữ 4760, có vẻ hoạt động tốt, khi được kết hợp với phiên bản dll OpenSSL 1.0.1.

Dường như với tôi như sử dụng OpenSSL với Delphi XE2 là một chút khó khăn trong hộp. Cảm ơn bạn rất nhiều đến đội ngũ Indy vì đã làm việc chăm chỉ .... Nhưng có ai đó có thể giúp họ không? Đây thực sự là một dự án tuyệt vời và một sản phẩm tuyệt vời, nhưng khi nó phá vỡ, và khi bạn phải tuân theo một tiêu chuẩn chuyển động (như triển khai openSSL), có lẽ một chút tài liệu và thử nghiệm, và nhãn cầu sẽ giúp ích. Tôi sẵn sàng hỗ trợ nếu có ai có thể chỉ cho tôi cách tôi có thể giúp đỡ. Các vấn đề với SSL không phải là không rõ ràng, vì tôi nhận thấy rằng các nhà cung cấp thành phần khác và những người nguồn mở có các phiên bản cụ thể của các dll OpenSSL mà họ hỗ trợ hoặc không hỗ trợ.

Một số điều thú vị khác mà tôi đã học được hôm nay: Nếu bạn không gặp vấn đề lớn với SSL trước khi bạn bắt đầu chơi xung quanh, bạn có thể dễ dàng làm cho nó tồi tệ hơn nếu bạn cài đặt một loạt các phiên bản trình cài đặt từ OpenSSL website.

+2

Tôi luôn có các dll cần thiết trong thư mục ứng dụng để tránh các sự cố cài đặt. Nếu phiên bản API của bên thứ ba cụ thể cho dự án của bạn, thì LUÔN LUÔN có các tệp cục bộ có thể truy cập được. – Misha

+0

Điểm tốt Misha. Tôi dự định làm như vậy trong suốt quá trình phát triển và triển khai. –

+1

@WarrenP - vì vậy, trong ngắn hạn, đề xuất của bạn là gì? Cá nhân, tôi chỉ không bao giờ sử dụng phiên bản vận chuyển của Indy nhưng sử dụng phiên bản SVN thay thế. Dĩ nhiên, đây không phải là bữa trưa miễn phí, nhưng tôi thấy rằng tôi thích biên dịch lại mọi thứ (Indy và bất kỳ thành phần nào của bên thứ ba sử dụng nó) thay vì nhấn vào những thiếu sót của các phiên bản được vận chuyển (vì một số lý do luôn có vấn đề) –