mirror of
https://github.com/moparisthebest/curl
synced 2024-12-23 16:48:49 -05:00
65ca229461
- Deduplicate the logic used by write-out and write-out json. Rather than have separate writeLong, writeString, etc, logic for each of write-out and write-out json instead have respective shared functions that can output either format and a 'use_json' parameter to indicate whether it is json that is output. This will make it easier to maintain. Rather than have to go through two sets of logic now we only have to go through one. - Support write-out %{errormsg} and %{exitcode} in json. - Clarify in the doc that %{exitcode} is the exit code of the transfer. Prior to this change it just said "The numerical exitcode" which implies it's the exit code of the tool, and it's not necessarily that. Closes https://github.com/curl/curl/pull/6544
92 lines
2.5 KiB
C
92 lines
2.5 KiB
C
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
*
|
|
* This software is licensed as described in the file COPYING, which
|
|
* you should have received as part of this distribution. The terms
|
|
* are also available at https://curl.se/docs/copyright.html.
|
|
*
|
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
* copies of the Software, and permit persons to whom the Software is
|
|
* furnished to do so, under the terms of the COPYING file.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
***************************************************************************/
|
|
#include "tool_setup.h"
|
|
|
|
#define ENABLE_CURLX_PRINTF
|
|
|
|
/* use our own printf() functions */
|
|
#include "curlx.h"
|
|
#include "tool_cfgable.h"
|
|
#include "tool_writeout_json.h"
|
|
#include "tool_writeout.h"
|
|
|
|
|
|
void jsonWriteString(FILE *stream, const char *in)
|
|
{
|
|
const char *i = in;
|
|
const char *in_end = in + strlen(in);
|
|
|
|
for(; i < in_end; i++) {
|
|
switch(*i) {
|
|
case '\\':
|
|
fputs("\\\\", stream);
|
|
break;
|
|
case '\"':
|
|
fputs("\\\"", stream);
|
|
break;
|
|
case '\b':
|
|
fputs("\\b", stream);
|
|
break;
|
|
case '\f':
|
|
fputs("\\f", stream);
|
|
break;
|
|
case '\n':
|
|
fputs("\\n", stream);
|
|
break;
|
|
case '\r':
|
|
fputs("\\r", stream);
|
|
break;
|
|
case '\t':
|
|
fputs("\\t", stream);
|
|
break;
|
|
default:
|
|
if (*i < 32) {
|
|
fprintf(stream, "u%04x", *i);
|
|
}
|
|
else {
|
|
fputc(*i, stream);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ourWriteOutJSON(FILE *stream, const struct writeoutvar mappings[],
|
|
struct per_transfer *per, CURLcode per_result)
|
|
{
|
|
int i;
|
|
|
|
fputs("{", stream);
|
|
|
|
for(i = 0; mappings[i].name != NULL; i++) {
|
|
if(mappings[i].writefunc &&
|
|
mappings[i].writefunc(stream, &mappings[i], per, per_result, true))
|
|
fputs(",", stream);
|
|
}
|
|
|
|
/* The variables are sorted in alphabetical order but as a special case
|
|
curl_version (which is not actually a --write-out variable) is last. */
|
|
fprintf(stream, "\"curl_version\":\"");
|
|
jsonWriteString(stream, curl_version());
|
|
fprintf(stream, "\"}");
|
|
}
|