AWS.Client引发了PROGRAM_ERROR:aws-client.adb:543完成/调整引发的异常

时间:2017-01-08 16:05:01

标签: json rest curl ada

我正在尝试编写一个简单的Ada(使用AWS)程序将数据发布到服务器。 curl命令的工作方式如下,并在成功登录后返回JSON中的有效响应:

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创建一个帐户并替换登录凭据。

感谢。

阿德里安

2 个答案:

答案 0 :(得分:1)

经过一些小的改动(主要是因为我不喜欢编译器警告),以及对Debian / Jessie版AWS的改编,我得到了它的工作。

以下是改编后的版本:

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版本/安装中。

答案 1 :(得分:1)

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

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

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