Getting p:http-request response body when error

Hi, 

Back to an xproc dev for a long time, trying xproc 3.0 with  last Morgana release, fun :)
But have a problem to get the body of a 400 response error, I only manage to get the headers of the response : 

I off course use a try/catch so the pipeline doesn't break on error. But from within the catch I can't get the result the p:http-request which is not accessible.

Let's just explain that the REST API I'm calling give information on the error in the body of the response.
For example  : 
{
  "status": 400,
  "errors": [
    {
      "received": "toto",
      "code": "invalid_enum_value",
      "options": [
        "unique",
        "multiple"
      ],
      "path": ["selectionType"],
      "message": "Invalid enum value. Expected 'unique' | 'multiple', received 'toto'"
    }
  ]
}
My try/catch looks like this : 

<p:try name="try">
  <p:output port="result">
    <p:pipe port="result" step="sendFile"/>
  </p:output>
  <p:http-request name="sendFile" method="PUT">
    <p:with-option name="href" select="'https://my/api/test'"/>
    <p:with-option name="headers" select="map{'content-type': 'application/json'}"/>
  </p:http-request>
  <p:catch>
    <p:output port="result">
      <p:pipe port="result" step="identity"/>
    </p:output>
    <p:identity name="identity"/>
  </p:catch>
</p:try>

The output of this step is a c:errors containing a map with headers of the response :
<c:error code="err:XC0126" name="sendFile" type="p:http-request" href="..." line="56" column="114">
    <message>Assert expression '.?status-code lt 400' evaluates to false(). See response transcript below:</message>
    <map xmlns="http://www.w3.org/2005/xpath-functions">
      <number key="status-code">400</number>
      <map key="headers">
        <string key="cache-control">public, max-age=0, must-revalidate</string>
        <string key="connection">keep-alive</string>
        <string key="content-type">text/plain;charset=UTF-8</string>
        <string key="date">Wed, 01 Nov 2023 11:56:15 GMT</string>
        <string key="server">Vercel</string>
        <string key="strict-transport-security">max-age=63072000; includeSubDomains; preload</string>
        <string key="vary">RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url</string>
        <string key="x-matched-path">/api/[collection]</string>
        <string key="x-vercel-cache">MISS</string>
        <string key="x-vercel-execution-region">iad1</string>
        <string key="x-vercel-id">cdg1::iad1::wsjbl-1698839773942-dcd1ec205f6c</string>
        <string key="transfer-encoding">chunked</string>
      </map>
      <string key="base-uri"> https://my/api/test </string>
    </map>
  </c:error>

Is there a way to get the body of the response when the API return an error ?
I'd like to log the message " Invalid enum value. Expected 'unique' | 'multiple', received 'toto'" from the body

Thanks in advance,

Matthieu Ricaud-Dussarget
Expert XML

M. 33(0)6 63 25 95 58
Nouvelle adresse : 
Tour Lefebvre Dalloz 
10 place des Vosges 92400 Courbevoie
www.lefebvre-dalloz.fr

Received on Wednesday, 1 November 2023 12:10:19 UTC