Annotation of embedaddon/curl/src/tool_writeout.c, revision 1.1

1.1     ! misho       1: /***************************************************************************
        !             2:  *                                  _   _ ____  _
        !             3:  *  Project                     ___| | | |  _ \| |
        !             4:  *                             / __| | | | |_) | |
        !             5:  *                            | (__| |_| |  _ <| |___
        !             6:  *                             \___|\___/|_| \_\_____|
        !             7:  *
        !             8:  * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
        !             9:  *
        !            10:  * This software is licensed as described in the file COPYING, which
        !            11:  * you should have received as part of this distribution. The terms
        !            12:  * are also available at https://curl.haxx.se/docs/copyright.html.
        !            13:  *
        !            14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
        !            15:  * copies of the Software, and permit persons to whom the Software is
        !            16:  * furnished to do so, under the terms of the COPYING file.
        !            17:  *
        !            18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
        !            19:  * KIND, either express or implied.
        !            20:  *
        !            21:  ***************************************************************************/
        !            22: #include "tool_setup.h"
        !            23: #define ENABLE_CURLX_PRINTF
        !            24: /* use our own printf() functions */
        !            25: #include "curlx.h"
        !            26: #include "tool_cfgable.h"
        !            27: #include "tool_writeout.h"
        !            28: #include "tool_writeout_json.h"
        !            29: 
        !            30: #include "memdebug.h" /* keep this as LAST include */
        !            31: 
        !            32: static const struct writeoutvar variables[] = {
        !            33:   {"url_effective", VAR_EFFECTIVE_URL, 0,
        !            34:    CURLINFO_EFFECTIVE_URL, JSON_STRING},
        !            35:   {"http_code", VAR_HTTP_CODE, 0,
        !            36:    CURLINFO_RESPONSE_CODE, JSON_LONG},
        !            37:   {"response_code", VAR_HTTP_CODE, 0,
        !            38:    CURLINFO_RESPONSE_CODE, JSON_LONG},
        !            39:   {"http_connect", VAR_HTTP_CODE_PROXY, 0,
        !            40:    CURLINFO_HTTP_CONNECTCODE, JSON_LONG},
        !            41:   {"time_total", VAR_TOTAL_TIME, 0,
        !            42:    CURLINFO_TOTAL_TIME_T, JSON_TIME},
        !            43:   {"time_namelookup", VAR_NAMELOOKUP_TIME, 0,
        !            44:    CURLINFO_NAMELOOKUP_TIME_T, JSON_TIME},
        !            45:   {"time_connect", VAR_CONNECT_TIME, 0,
        !            46:    CURLINFO_CONNECT_TIME_T, JSON_TIME},
        !            47:   {"time_appconnect", VAR_APPCONNECT_TIME, 0,
        !            48:    CURLINFO_APPCONNECT_TIME_T, JSON_TIME},
        !            49:   {"time_pretransfer", VAR_PRETRANSFER_TIME, 0,
        !            50:    CURLINFO_PRETRANSFER_TIME_T, JSON_TIME},
        !            51:   {"time_starttransfer", VAR_STARTTRANSFER_TIME, 0,
        !            52:    CURLINFO_STARTTRANSFER_TIME_T, JSON_TIME},
        !            53:   {"size_header", VAR_HEADER_SIZE, 0,
        !            54:    CURLINFO_HEADER_SIZE, JSON_LONG},
        !            55:   {"size_request", VAR_REQUEST_SIZE, 0,
        !            56:    CURLINFO_REQUEST_SIZE, JSON_LONG},
        !            57:   {"size_download", VAR_SIZE_DOWNLOAD, 0,
        !            58:    CURLINFO_SIZE_DOWNLOAD_T, JSON_OFFSET},
        !            59:   {"size_upload", VAR_SIZE_UPLOAD, 0,
        !            60:    CURLINFO_SIZE_UPLOAD_T, JSON_OFFSET},
        !            61:   {"speed_download", VAR_SPEED_DOWNLOAD, 0,
        !            62:    CURLINFO_SPEED_DOWNLOAD_T, JSON_OFFSET},
        !            63:   {"speed_upload", VAR_SPEED_UPLOAD, 0,
        !            64:    CURLINFO_SPEED_UPLOAD_T, JSON_OFFSET},
        !            65:   {"content_type", VAR_CONTENT_TYPE, 0,
        !            66:    CURLINFO_CONTENT_TYPE, JSON_STRING},
        !            67:   {"num_connects", VAR_NUM_CONNECTS, 0,
        !            68:    CURLINFO_NUM_CONNECTS, JSON_LONG},
        !            69:   {"time_redirect", VAR_REDIRECT_TIME, 0,
        !            70:    CURLINFO_REDIRECT_TIME_T, JSON_TIME},
        !            71:   {"num_redirects", VAR_REDIRECT_COUNT, 0,
        !            72:    CURLINFO_REDIRECT_COUNT, JSON_LONG},
        !            73:   {"ftp_entry_path", VAR_FTP_ENTRY_PATH, 0,
        !            74:    CURLINFO_FTP_ENTRY_PATH, JSON_STRING},
        !            75:   {"redirect_url", VAR_REDIRECT_URL, 0,
        !            76:    CURLINFO_REDIRECT_URL, JSON_STRING},
        !            77:   {"ssl_verify_result", VAR_SSL_VERIFY_RESULT, 0,
        !            78:    CURLINFO_SSL_VERIFYRESULT, JSON_LONG},
        !            79:   {"proxy_ssl_verify_result", VAR_PROXY_SSL_VERIFY_RESULT, 0,
        !            80:    CURLINFO_PROXY_SSL_VERIFYRESULT, JSON_LONG},
        !            81:   {"filename_effective", VAR_EFFECTIVE_FILENAME, 0,
        !            82:    0, JSON_FILENAME},
        !            83:   {"remote_ip", VAR_PRIMARY_IP, 0,
        !            84:    CURLINFO_PRIMARY_IP, JSON_STRING},
        !            85:   {"remote_port", VAR_PRIMARY_PORT, 0,
        !            86:    CURLINFO_PRIMARY_PORT, JSON_LONG},
        !            87:   {"local_ip", VAR_LOCAL_IP, 0,
        !            88:    CURLINFO_LOCAL_IP, JSON_STRING},
        !            89:   {"local_port", VAR_LOCAL_PORT, 0,
        !            90:    CURLINFO_LOCAL_PORT, JSON_LONG},
        !            91:   {"http_version", VAR_HTTP_VERSION, 0,
        !            92:    CURLINFO_HTTP_VERSION, JSON_VERSION},
        !            93:   {"scheme", VAR_SCHEME, 0,
        !            94:    CURLINFO_SCHEME, JSON_STRING},
        !            95:   {"stdout", VAR_STDOUT, 1,
        !            96:    0, JSON_NONE},
        !            97:   {"stderr", VAR_STDERR, 1,
        !            98:    0, JSON_NONE},
        !            99:   {"json", VAR_JSON, 1,
        !           100:    0, JSON_NONE},
        !           101:   {NULL, VAR_NONE, 1,
        !           102:    0, JSON_NONE}
        !           103: };
        !           104: 
        !           105: void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
        !           106: {
        !           107:   FILE *stream = stdout;
        !           108:   const char *ptr = writeinfo;
        !           109:   char *stringp = NULL;
        !           110:   long longinfo;
        !           111:   double doubleinfo;
        !           112: 
        !           113:   while(ptr && *ptr) {
        !           114:     if('%' == *ptr && ptr[1]) {
        !           115:       if('%' == ptr[1]) {
        !           116:         /* an escaped %-letter */
        !           117:         fputc('%', stream);
        !           118:         ptr += 2;
        !           119:       }
        !           120:       else {
        !           121:         /* this is meant as a variable to output */
        !           122:         char *end;
        !           123:         if('{' == ptr[1]) {
        !           124:           char keepit;
        !           125:           int i;
        !           126:           bool match = FALSE;
        !           127:           end = strchr(ptr, '}');
        !           128:           ptr += 2; /* pass the % and the { */
        !           129:           if(!end) {
        !           130:             fputs("%{", stream);
        !           131:             continue;
        !           132:           }
        !           133:           keepit = *end;
        !           134:           *end = 0; /* zero terminate */
        !           135:           for(i = 0; variables[i].name; i++) {
        !           136:             if(curl_strequal(ptr, variables[i].name)) {
        !           137:               match = TRUE;
        !           138:               switch(variables[i].id) {
        !           139:               case VAR_EFFECTIVE_URL:
        !           140:                 if((CURLE_OK ==
        !           141:                     curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &stringp))
        !           142:                    && stringp)
        !           143:                   fputs(stringp, stream);
        !           144:                 break;
        !           145:               case VAR_HTTP_CODE:
        !           146:                 if(CURLE_OK ==
        !           147:                    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &longinfo))
        !           148:                   fprintf(stream, "%03ld", longinfo);
        !           149:                 break;
        !           150:               case VAR_HTTP_CODE_PROXY:
        !           151:                 if(CURLE_OK ==
        !           152:                    curl_easy_getinfo(curl, CURLINFO_HTTP_CONNECTCODE,
        !           153:                                      &longinfo))
        !           154:                   fprintf(stream, "%03ld", longinfo);
        !           155:                 break;
        !           156:               case VAR_HEADER_SIZE:
        !           157:                 if(CURLE_OK ==
        !           158:                    curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &longinfo))
        !           159:                   fprintf(stream, "%ld", longinfo);
        !           160:                 break;
        !           161:               case VAR_REQUEST_SIZE:
        !           162:                 if(CURLE_OK ==
        !           163:                    curl_easy_getinfo(curl, CURLINFO_REQUEST_SIZE, &longinfo))
        !           164:                   fprintf(stream, "%ld", longinfo);
        !           165:                 break;
        !           166:               case VAR_NUM_CONNECTS:
        !           167:                 if(CURLE_OK ==
        !           168:                    curl_easy_getinfo(curl, CURLINFO_NUM_CONNECTS, &longinfo))
        !           169:                   fprintf(stream, "%ld", longinfo);
        !           170:                 break;
        !           171:               case VAR_REDIRECT_COUNT:
        !           172:                 if(CURLE_OK ==
        !           173:                    curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, &longinfo))
        !           174:                   fprintf(stream, "%ld", longinfo);
        !           175:                 break;
        !           176:               case VAR_REDIRECT_TIME:
        !           177:                 if(CURLE_OK ==
        !           178:                    curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME,
        !           179:                                      &doubleinfo))
        !           180:                   fprintf(stream, "%.6f", doubleinfo);
        !           181:                 break;
        !           182:               case VAR_TOTAL_TIME:
        !           183:                 if(CURLE_OK ==
        !           184:                    curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &doubleinfo))
        !           185:                   fprintf(stream, "%.6f", doubleinfo);
        !           186:                 break;
        !           187:               case VAR_NAMELOOKUP_TIME:
        !           188:                 if(CURLE_OK ==
        !           189:                    curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME,
        !           190:                                      &doubleinfo))
        !           191:                   fprintf(stream, "%.6f", doubleinfo);
        !           192:                 break;
        !           193:               case VAR_CONNECT_TIME:
        !           194:                 if(CURLE_OK ==
        !           195:                    curl_easy_getinfo(curl, CURLINFO_CONNECT_TIME, &doubleinfo))
        !           196:                   fprintf(stream, "%.6f", doubleinfo);
        !           197:                 break;
        !           198:               case VAR_APPCONNECT_TIME:
        !           199:                 if(CURLE_OK ==
        !           200:                    curl_easy_getinfo(curl, CURLINFO_APPCONNECT_TIME,
        !           201:                                      &doubleinfo))
        !           202:                   fprintf(stream, "%.6f", doubleinfo);
        !           203:                 break;
        !           204:               case VAR_PRETRANSFER_TIME:
        !           205:                 if(CURLE_OK ==
        !           206:                    curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME,
        !           207:                                      &doubleinfo))
        !           208:                   fprintf(stream, "%.6f", doubleinfo);
        !           209:                 break;
        !           210:               case VAR_STARTTRANSFER_TIME:
        !           211:                 if(CURLE_OK ==
        !           212:                    curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME,
        !           213:                                      &doubleinfo))
        !           214:                   fprintf(stream, "%.6f", doubleinfo);
        !           215:                 break;
        !           216:               case VAR_SIZE_UPLOAD:
        !           217:                 if(CURLE_OK ==
        !           218:                    curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &doubleinfo))
        !           219:                   fprintf(stream, "%.0f", doubleinfo);
        !           220:                 break;
        !           221:               case VAR_SIZE_DOWNLOAD:
        !           222:                 if(CURLE_OK ==
        !           223:                    curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD,
        !           224:                                      &doubleinfo))
        !           225:                   fprintf(stream, "%.0f", doubleinfo);
        !           226:                 break;
        !           227:               case VAR_SPEED_DOWNLOAD:
        !           228:                 if(CURLE_OK ==
        !           229:                    curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD,
        !           230:                                      &doubleinfo))
        !           231:                   fprintf(stream, "%.3f", doubleinfo);
        !           232:                 break;
        !           233:               case VAR_SPEED_UPLOAD:
        !           234:                 if(CURLE_OK ==
        !           235:                    curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &doubleinfo))
        !           236:                   fprintf(stream, "%.3f", doubleinfo);
        !           237:                 break;
        !           238:               case VAR_CONTENT_TYPE:
        !           239:                 if((CURLE_OK ==
        !           240:                     curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &stringp))
        !           241:                    && stringp)
        !           242:                   fputs(stringp, stream);
        !           243:                 break;
        !           244:               case VAR_FTP_ENTRY_PATH:
        !           245:                 if((CURLE_OK ==
        !           246:                     curl_easy_getinfo(curl, CURLINFO_FTP_ENTRY_PATH, &stringp))
        !           247:                    && stringp)
        !           248:                   fputs(stringp, stream);
        !           249:                 break;
        !           250:               case VAR_REDIRECT_URL:
        !           251:                 if((CURLE_OK ==
        !           252:                     curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, &stringp))
        !           253:                    && stringp)
        !           254:                   fputs(stringp, stream);
        !           255:                 break;
        !           256:               case VAR_SSL_VERIFY_RESULT:
        !           257:                 if(CURLE_OK ==
        !           258:                    curl_easy_getinfo(curl, CURLINFO_SSL_VERIFYRESULT,
        !           259:                                      &longinfo))
        !           260:                   fprintf(stream, "%ld", longinfo);
        !           261:                 break;
        !           262:               case VAR_PROXY_SSL_VERIFY_RESULT:
        !           263:                 if(CURLE_OK ==
        !           264:                    curl_easy_getinfo(curl, CURLINFO_PROXY_SSL_VERIFYRESULT,
        !           265:                                      &longinfo))
        !           266:                   fprintf(stream, "%ld", longinfo);
        !           267:                 break;
        !           268:               case VAR_EFFECTIVE_FILENAME:
        !           269:                 if(outs->filename)
        !           270:                   fprintf(stream, "%s", outs->filename);
        !           271:                 break;
        !           272:               case VAR_PRIMARY_IP:
        !           273:                 if(CURLE_OK ==
        !           274:                    curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP,
        !           275:                                      &stringp))
        !           276:                   fprintf(stream, "%s", stringp);
        !           277:                 break;
        !           278:               case VAR_PRIMARY_PORT:
        !           279:                 if(CURLE_OK ==
        !           280:                    curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT,
        !           281:                                      &longinfo))
        !           282:                   fprintf(stream, "%ld", longinfo);
        !           283:                 break;
        !           284:               case VAR_LOCAL_IP:
        !           285:                 if(CURLE_OK ==
        !           286:                    curl_easy_getinfo(curl, CURLINFO_LOCAL_IP,
        !           287:                                      &stringp))
        !           288:                   fprintf(stream, "%s", stringp);
        !           289:                 break;
        !           290:               case VAR_LOCAL_PORT:
        !           291:                 if(CURLE_OK ==
        !           292:                    curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT,
        !           293:                                      &longinfo))
        !           294:                   fprintf(stream, "%ld", longinfo);
        !           295:                 break;
        !           296:               case VAR_HTTP_VERSION:
        !           297:                 if(CURLE_OK ==
        !           298:                    curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION,
        !           299:                                      &longinfo)) {
        !           300:                   const char *version = "0";
        !           301:                   switch(longinfo) {
        !           302:                   case CURL_HTTP_VERSION_1_0:
        !           303:                     version = "1.0";
        !           304:                     break;
        !           305:                   case CURL_HTTP_VERSION_1_1:
        !           306:                     version = "1.1";
        !           307:                     break;
        !           308:                   case CURL_HTTP_VERSION_2_0:
        !           309:                     version = "2";
        !           310:                     break;
        !           311:                   case CURL_HTTP_VERSION_3:
        !           312:                     version = "3";
        !           313:                     break;
        !           314:                   }
        !           315: 
        !           316:                   fprintf(stream, version);
        !           317:                 }
        !           318:                 break;
        !           319:               case VAR_SCHEME:
        !           320:                 if(CURLE_OK ==
        !           321:                    curl_easy_getinfo(curl, CURLINFO_SCHEME,
        !           322:                                      &stringp))
        !           323:                   fprintf(stream, "%s", stringp);
        !           324:                 break;
        !           325:               case VAR_STDOUT:
        !           326:                 stream = stdout;
        !           327:                 break;
        !           328:               case VAR_STDERR:
        !           329:                 stream = stderr;
        !           330:                 break;
        !           331:               case VAR_JSON:
        !           332:                 ourWriteOutJSON(variables, curl, outs, stream);
        !           333:               default:
        !           334:                 break;
        !           335:               }
        !           336:               break;
        !           337:             }
        !           338:           }
        !           339:           if(!match) {
        !           340:             fprintf(stderr, "curl: unknown --write-out variable: '%s'\n", ptr);
        !           341:           }
        !           342:           ptr = end + 1; /* pass the end */
        !           343:           *end = keepit;
        !           344:         }
        !           345:         else {
        !           346:           /* illegal syntax, then just output the characters that are used */
        !           347:           fputc('%', stream);
        !           348:           fputc(ptr[1], stream);
        !           349:           ptr += 2;
        !           350:         }
        !           351:       }
        !           352:     }
        !           353:     else if('\\' == *ptr && ptr[1]) {
        !           354:       switch(ptr[1]) {
        !           355:       case 'r':
        !           356:         fputc('\r', stream);
        !           357:         break;
        !           358:       case 'n':
        !           359:         fputc('\n', stream);
        !           360:         break;
        !           361:       case 't':
        !           362:         fputc('\t', stream);
        !           363:         break;
        !           364:       default:
        !           365:         /* unknown, just output this */
        !           366:         fputc(*ptr, stream);
        !           367:         fputc(ptr[1], stream);
        !           368:         break;
        !           369:       }
        !           370:       ptr += 2;
        !           371:     }
        !           372:     else {
        !           373:       fputc(*ptr, stream);
        !           374:       ptr++;
        !           375:     }
        !           376:   }
        !           377: 
        !           378: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>