TNLCLI/TNLCLIPrint.m (54 lines of code) (raw):
//
// TNLCLIPrint.m
// tnlcli
//
// Created on 9/12/19.
// Copyright © 2020 Twitter. All rights reserved.
//
#import "TNLCLIPrint.h"
void TNLCLIPrintWarning(NSString *warning)
{
fprintf(stderr, "WARNING: %s\n", warning.UTF8String);
}
void TNLCLIPrintError(NSError *error)
{
fprintf(stderr, "ERR: %s:%li %s\n\n", error.domain.UTF8String, error.code, error.userInfo.description.UTF8String ?: "");
}
NSData *TNLCLIEnsureDataIsNullTerminated(NSData *data)
{
__block BOOL needsNULLTerminator = NO;
[data enumerateByteRangesUsingBlock:^(const void * _Nonnull bytes, NSRange byteRange, BOOL * _Nonnull stop) {
if (byteRange.location + byteRange.length == data.length) {
const char *cStr = bytes;
char c = cStr[byteRange.length - 1];
needsNULLTerminator = (c != '\0');
*stop = YES;
}
}];
if (needsNULLTerminator) {
@autoreleasepool {
NSMutableData *mData = [data mutableCopy];
[mData appendBytes:"" length:1];
data = [mData copy];
}
}
return data;
}
void TNLCLIPrintUsage(NSString * __nullable cliName)
{
// NOTE: when updating the usage, update the README.md too.
cliName = cliName ?: @"tnlcli";
tnlcli_fprintf(stderr, "Usage: %s [options] url\n\n", cliName.UTF8String);
tnlcli_fprintf(stderr, "\tExample: %s --request-method HEAD --response-header-mode file,print --response-header-file response_headers.json https://google.com\n\n", cliName.UTF8String);
tnlcli_fprintf(stderr, "Argument Options:\n-----------------\n\n");
tnlcli_fprintf(stderr, "\t--request-config-file <filepath> TNLRequestConfiguration as a json file\n");
tnlcli_fprintf(stderr, "\t--request-headers-file <filepath> json file of key-value-pairs for using as headers\n");
tnlcli_fprintf(stderr, "\t--request-body-file <filepath> file for the HTTP body\n");
tnlcli_fprintf(stderr, "\n");
tnlcli_fprintf(stderr, "\t--request-header \"Field: Value\" A header to provide with the request (will override the header if also in the request header file). Can provide multiple headers.\n");
tnlcli_fprintf(stderr, "\t--request-config \"config: value\" A config setting for the TNLRequestConfiguration of the request (will override the config if also in the request config file). Can provide multiple configs.\n");
tnlcli_fprintf(stderr, "\t--request-method <method> HTTP Method from Section 9 in HTTP/1.1 spec (RFC 2616), such as GET, POST, HEAD, etc\n");
tnlcli_fprintf(stderr, "\n");
tnlcli_fprintf(stderr, "\t--response-body-mode <mode> \"file\" or \"print\" or a combo using commas\n");
tnlcli_fprintf(stderr, "\t--response-body-file <filepath> file for the response body to save to (requires \"file\" for --response-body-mode\n");
tnlcli_fprintf(stderr, "\t--response-headers-mode <mode> \"file\" or \"print\" or a combo using commas\n");
tnlcli_fprintf(stderr, "\t--response-headers-file <filepath> file for the response headers to save to (as json)\n");
tnlcli_fprintf(stderr, "\n");
tnlcli_fprintf(stderr, "\t--dump-cert-chain-directory <dir> directory for the certification chain to be dumped to (as DER files)\n");
tnlcli_fprintf(stderr, "\n");
tnlcli_fprintf(stderr, "\t--verbose Will print verbose information and force the --response-body-mode and --responde-headers-mode to have \"print\".\n");
tnlcli_fprintf(stderr, "\t--version Will print ther version information.\n");
tnlcli_fprintf(stderr, "\n");
}