2017-01-08 25 views
0

我正在尝试编写一个简单的Ada(带AWS)程序来将数据发布到服务器。 curl命令工作如下,成功登录后,在返回JSON有效响应:AWS.Client引发PROGRAM_ERROR:aws-client.adb:543敲定异常

curl -XPOST -d '{"type":"m.login.password", "user":"xxx", "password": "xxxxxxxxxx"}' "https://matrix.org/_matrix/client/r0/login" 

我的Ada程序:

with Ada.Exceptions; use Ada.Exceptions; 
with Ada.Text_Io;  use Ada.Text_IO; 

with AWS.Client; 
with AWS.Communication.Client; 
with AWS.MIME; 
with AWS.Net; 
with AWS.Response; 

use AWS; 


procedure Communicate is 

    Result : Response.Data; 
    Data : String := "{""type"":""m.login.password"", ""user"":""xxx"", ""password"": ""xxxxxxxxxx""}"; 

begin 

    Result := Client.Post 
     (URL => "https://matrix.org/_matrix/client/r0/login", 
     Data => Data, 
     Content_Type => AWS.MIME.Application_JSON) ; 

    Put_Line (Response.Message_Body (Result)) ; 

end Communicate; 

异常升高。我无法弄清楚这段代码有什么问题。

$ ./Communicate 

raised PROGRAM_ERROR : aws-client.adb:543 finalize/adjust raised exception 

测试代码,你可以在http://matrix.org创建一个帐户,并更换登录凭证。

感谢。

阿德里安

+0

您的AWS是否包含SSL支持? FWIW,我在AWS.NET.SSL中的'/users/bauhaus/src/aws/src/core/aws-client.adb:210'调用'initialize'处看到相同的消息和调试点(aws-net-ssl__dummy .adb:148),该软件包声称“每次使用此接口都会引发Program_Error异常。” – B98

+0

如何检查AWS是否包含SSL支持? –

+0

事实上,也就是在安装之后,我首先看看libaws所需的其他库。例如,通过在Mac上运行'xcrun dyldinfo -dylibs'或在GNU/Linux上运行'ldd'。 (第二个列表是libgnutls。)否则,应该有一些包含该信息的安装过程的日志。 – B98

回答

1

一些小的改动(主要是因为我不喜欢的编译器警告),以及适应于AWS的是Debian /杰西版本后,我得到它的工作。

这里的改编版:

with Ada.Text_IO;  use Ada.Text_IO; 

with AWS.Client; 
-- with AWS.MIME; 
with AWS.Response; 

use AWS; 

procedure Communicate is 

    Result : Response.Data; 
    Data : constant String := 
         "{""type"":""m.login.password"", ""user"":""xxx"", " & 
         """password"": ""xxxxxxxxxx""}"; 

begin 
    Result := Client.Post 
     (URL   => "https://matrix.org/_matrix/client/r0/login", 
     Data   => Data, 
     Content_Type => "application/json"); 
    -- Content_Type => AWS.MIME.Application_JSON); 

    Put_Line (Response.Message_Body (Result)); 
end Communicate; 

这里是我的项目文件:

with "aws"; 

project Communicate is 
    for Main use ("communicate"); 

    package Builder is 
     for Default_Switches ("Ada") 
     use ("-m"); 
    end Builder; 

    package Compiler is 
     for Default_Switches ("Ada") 
     use ("-fstack-check", -- Generate stack checking code (part of Ada) 
      "-gnata",  -- Enable assertions   (part of Ada) 
      "-gnato13",  -- Overflow checking   (part of Ada) 
      "-gnatf",      -- Full, verbose error messages 
      "-gnatwa",      -- All optional warnings 
      "-gnatVa",      -- All validity checks 
      "-gnaty3abcdefhiklmnoOprstux", -- Style checks 
      "-gnatwe",      -- Treat warnings as errors 
      "-gnat2012",     -- Use Ada 2012 
      "-Wall",      -- All GCC warnings 
      "-O2");      -- Optimise (level 2/3) 
    end Compiler; 
end Communicate; 

我建搭配方案:

% gprbuild -P communicate 
gnatgcc -c -fstack-check -gnata -gnato13 -gnatf -gnatwa -gnatVa -gnaty3abcdefhiklmnoOprstux -gnatwe -gnat2012 -Wall -O2 communicate.adb 
gprbind communicate.bexch 
gnatbind communicate.ali 
gnatgcc -c b__communicate.adb 
gnatgcc communicate.o -L/usr/lib/x86_64-linux-gnu -lgnutls -lz -llber -lldap -lpthread -o communicate 
% 

然后用测试

% ./communicate 
{"errcode":"M_FORBIDDEN","error":"Invalid password"} 
% 

看起来问题存在于您的AWS版本/安装中。

+0

它不起作用。我怀疑@ B98所指的是什么。 –

0

通过使用MacPorts中的gnutls构建AWS解决了问题。 Apple自OS X Lion以来不推荐使用OpenSSL,并使用CommonCrypto,因此现代macOS不包含OpenSSL。解决方案是从Mac端口或Home Brew下载并安装OpenSSL或gnutls。

另一个问题是苹果公司自El Capitan以来推出了SIP(系统完整性保护)。启用S​​IP后,具有管理员权限的用户无法更改/ usr/include和/ usr/lib中的内容。

Mac端口安装到/ opt/local,因此我引用了/ opt/local/include和/ opt/local/lib,以便AWS可以使用OpenSSL或gnutls进行构建。