1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-12 10:04:14 +02:00

Rename uri to path where appropriate in HTTP and storage modules.

The path was originally named uri due to the canonicalized path being called "canonicalized uri" in the S3 authentication documentation. The name got propagated everywhere from there.

This is not correct for general usage, however, so rename to path when describing the path component of an HTTP request.
This commit is contained in:
David Steele 2021-02-19 08:22:50 -05:00
parent dcb79ab8fb
commit 1b4b3538cc
11 changed files with 94 additions and 94 deletions

View File

@ -44,7 +44,7 @@ struct HttpRequest
MemContext *memContext; // Mem context
HttpClient *client; // HTTP client
const String *verb; // HTTP verb (GET, POST, etc.)
const String *uri; // HTTP URI
const String *path; // HTTP path
const HttpQuery *query; // HTTP query
const HttpHeader *header; // HTTP headers
const Buffer *content; // HTTP content
@ -56,7 +56,7 @@ OBJECT_DEFINE_MOVE(HTTP_REQUEST);
OBJECT_DEFINE_FREE(HTTP_REQUEST);
OBJECT_DEFINE_GET(Verb, const, HTTP_REQUEST, const String *, verb);
OBJECT_DEFINE_GET(Uri, const, HTTP_REQUEST, const String *, uri);
OBJECT_DEFINE_GET(Path, const, HTTP_REQUEST, const String *, path);
OBJECT_DEFINE_GET(Query, const, HTTP_REQUEST, const HttpQuery *, query);
OBJECT_DEFINE_GET(Header, const, HTTP_REQUEST, const HttpHeader *, header);
@ -108,7 +108,7 @@ httpRequestProcess(HttpRequest *this, bool waitForResponse, bool contentCache)
String *requestStr =
strNewFmt(
"%s %s%s%s " HTTP_VERSION CRLF_Z HTTP_HEADER_USER_AGENT ":" PROJECT_NAME "/" PROJECT_VERSION CRLF_Z,
strZ(this->verb), strZ(httpUriEncode(this->uri, true)), this->query == NULL ? "" : "?",
strZ(this->verb), strZ(httpUriEncode(this->path, true)), this->query == NULL ? "" : "?",
this->query == NULL ? "" : strZ(httpQueryRenderP(this->query)));
// Add headers
@ -181,19 +181,19 @@ httpRequestProcess(HttpRequest *this, bool waitForResponse, bool contentCache)
/**********************************************************************************************************************************/
HttpRequest *
httpRequestNew(HttpClient *client, const String *verb, const String *uri, HttpRequestNewParam param)
httpRequestNew(HttpClient *client, const String *verb, const String *path, HttpRequestNewParam param)
{
FUNCTION_LOG_BEGIN(logLevelDebug)
FUNCTION_LOG_PARAM(HTTP_CLIENT, client);
FUNCTION_LOG_PARAM(STRING, verb);
FUNCTION_LOG_PARAM(STRING, uri);
FUNCTION_LOG_PARAM(STRING, path);
FUNCTION_LOG_PARAM(HTTP_QUERY, param.query);
FUNCTION_LOG_PARAM(HTTP_HEADER, param.header);
FUNCTION_LOG_PARAM(BUFFER, param.content);
FUNCTION_LOG_END();
ASSERT(verb != NULL);
ASSERT(uri != NULL);
ASSERT(path != NULL);
HttpRequest *this = NULL;
@ -206,7 +206,7 @@ httpRequestNew(HttpClient *client, const String *verb, const String *uri, HttpRe
.memContext = MEM_CONTEXT_NEW(),
.client = client,
.verb = strDup(verb),
.uri = strDup(uri),
.path = strDup(path),
.query = httpQueryDupP(param.query),
.header = param.header == NULL ? httpHeaderNew(NULL) : httpHeaderDup(param.header, NULL),
.content = param.content == NULL ? NULL : bufDup(param.content),
@ -254,10 +254,10 @@ httpRequestError(const HttpRequest *this, HttpResponse *response)
if (strSize(httpResponseReason(response)) > 0)
strCatFmt(error, " (%s)", strZ(httpResponseReason(response)));
// Output uri/query
strCatZ(error, ":\n*** URI/Query ***:");
// Output path/query
strCatZ(error, ":\n*** Path/Query ***:");
strCatFmt(error, "\n%s", strZ(httpUriEncode(this->uri, true)));
strCatFmt(error, "\n%s", strZ(httpUriEncode(this->path, true)));
if (this->query != NULL)
strCatFmt(error, "?%s", strZ(httpQueryRenderP(this->query, .redact = true)));
@ -309,7 +309,7 @@ String *
httpRequestToLog(const HttpRequest *this)
{
return strNewFmt(
"{verb: %s, uri: %s, query: %s, header: %s, contentSize: %zu}", strZ(this->verb), strZ(this->uri),
"{verb: %s, path: %s, query: %s, header: %s, contentSize: %zu}", strZ(this->verb), strZ(this->path),
this->query == NULL ? "null" : strZ(httpQueryToLog(this->query)), strZ(httpHeaderToLog(this->header)),
this->content == NULL ? 0 : bufUsed(this->content));
}

View File

@ -65,10 +65,10 @@ typedef struct HttpRequestNewParam
const Buffer *content;
} HttpRequestNewParam;
#define httpRequestNewP(client, verb, uri, ...) \
httpRequestNew(client, verb, uri, (HttpRequestNewParam){VAR_PARAM_INIT, __VA_ARGS__})
#define httpRequestNewP(client, verb, path, ...) \
httpRequestNew(client, verb, path, (HttpRequestNewParam){VAR_PARAM_INIT, __VA_ARGS__})
HttpRequest *httpRequestNew(HttpClient *client, const String *verb, const String *uri, HttpRequestNewParam param);
HttpRequest *httpRequestNew(HttpClient *client, const String *verb, const String *path, HttpRequestNewParam param);
/***********************************************************************************************************************************
Functions
@ -88,8 +88,8 @@ Getters/Setters
// Request verb
const String *httpRequestVerb(const HttpRequest *this);
// Request URI
const String *httpRequestUri(const HttpRequest *this);
// Request path
const String *httpRequestPath(const HttpRequest *this);
// Request query
const HttpQuery *httpRequestQuery(const HttpRequest *this);

View File

@ -59,7 +59,7 @@ storageReadAzureOpen(THIS_VOID)
MEM_CONTEXT_BEGIN(this->memContext)
{
this->httpResponse = storageAzureRequestP(
this->storage, HTTP_VERB_GET_STR, .uri = this->interface.name, .allowMissing = true, .contentIo = true);
this->storage, HTTP_VERB_GET_STR, .path = this->interface.name, .allowMissing = true, .contentIo = true);
}
MEM_CONTEXT_END();

View File

@ -75,7 +75,7 @@ struct StorageAzure
const HttpQuery *sasKey; // SAS key
const String *host; // Host name
size_t blockSize; // Block size for multi-block upload
const String *uriPrefix; // Account/container prefix
const String *pathPrefix; // Account/container prefix
uint64_t fileId; // Id to used to make file block identifiers unique
};
@ -87,12 +87,12 @@ Based on the documentation at https://docs.microsoft.com/en-us/rest/api/storages
***********************************************************************************************************************************/
static void
storageAzureAuth(
StorageAzure *this, const String *verb, const String *uri, HttpQuery *query, const String *dateTime, HttpHeader *httpHeader)
StorageAzure *this, const String *verb, const String *path, HttpQuery *query, const String *dateTime, HttpHeader *httpHeader)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STORAGE_AZURE, this);
FUNCTION_TEST_PARAM(STRING, verb);
FUNCTION_TEST_PARAM(STRING, uri);
FUNCTION_TEST_PARAM(STRING, path);
FUNCTION_TEST_PARAM(HTTP_QUERY, query);
FUNCTION_TEST_PARAM(STRING, dateTime);
FUNCTION_TEST_PARAM(KEY_VALUE, httpHeader);
@ -100,7 +100,7 @@ storageAzureAuth(
ASSERT(this != NULL);
ASSERT(verb != NULL);
ASSERT(uri != NULL);
ASSERT(path != NULL);
ASSERT(dateTime != NULL);
ASSERT(httpHeader != NULL);
ASSERT(httpHeaderGet(httpHeader, HTTP_HEADER_CONTENT_LENGTH_STR) != NULL);
@ -165,10 +165,10 @@ storageAzureAuth(
"\n" // If-Unmodified-Since
"\n" // range
"%s" // Canonicalized headers
"/%s%s" // Canonicalized account/uri
"/%s%s" // Canonicalized account/path
"%s", // Canonicalized query
strZ(verb), strEq(contentLength, ZERO_STR) ? "" : strZ(contentLength), contentMd5 == NULL ? "" : strZ(contentMd5),
strZ(dateTime), strZ(headerCanonical), strZ(this->account), strZ(uri), strZ(queryCanonical));
strZ(dateTime), strZ(headerCanonical), strZ(this->account), strZ(path), strZ(queryCanonical));
// Generate authorization header
Buffer *keyBin = bufNew(decodeToBinSize(encodeBase64, strZ(this->sharedKey)));
@ -201,7 +201,7 @@ storageAzureRequestAsync(StorageAzure *this, const String *verb, StorageAzureReq
FUNCTION_LOG_BEGIN(logLevelDebug);
FUNCTION_LOG_PARAM(STORAGE_AZURE, this);
FUNCTION_LOG_PARAM(STRING, verb);
FUNCTION_LOG_PARAM(STRING, param.uri);
FUNCTION_LOG_PARAM(STRING, param.path);
FUNCTION_LOG_PARAM(HTTP_HEADER, param.header);
FUNCTION_LOG_PARAM(HTTP_QUERY, param.query);
FUNCTION_LOG_PARAM(BUFFER, param.content);
@ -214,8 +214,8 @@ storageAzureRequestAsync(StorageAzure *this, const String *verb, StorageAzureReq
MEM_CONTEXT_TEMP_BEGIN()
{
// Prepend uri prefix
param.uri = param.uri == NULL ? this->uriPrefix : strNewFmt("%s%s", strZ(this->uriPrefix), strZ(param.uri));
// Prepend path prefix
param.path = param.path == NULL ? this->pathPrefix : strNewFmt("%s%s", strZ(this->pathPrefix), strZ(param.path));
// Create header list and add content length
HttpHeader *requestHeader = param.header == NULL ?
@ -241,13 +241,13 @@ storageAzureRequestAsync(StorageAzure *this, const String *verb, StorageAzureReq
httpQueryDupP(param.query, .redactList = this->queryRedactList);
// Generate authorization header
storageAzureAuth(this, verb, httpUriEncode(param.uri, true), query, httpDateFromTime(time(NULL)), requestHeader);
storageAzureAuth(this, verb, httpUriEncode(param.path, true), query, httpDateFromTime(time(NULL)), requestHeader);
// Send request
MEM_CONTEXT_PRIOR_BEGIN()
{
result = httpRequestNewP(
this->httpClient, verb, param.uri, .query = query, .header = requestHeader, .content = param.content);
this->httpClient, verb, param.path, .query = query, .header = requestHeader, .content = param.content);
}
MEM_CONTEXT_END();
}
@ -292,7 +292,7 @@ storageAzureRequest(StorageAzure *this, const String *verb, StorageAzureRequestP
FUNCTION_LOG_BEGIN(logLevelDebug);
FUNCTION_LOG_PARAM(STORAGE_AZURE, this);
FUNCTION_LOG_PARAM(STRING, verb);
FUNCTION_LOG_PARAM(STRING, param.uri);
FUNCTION_LOG_PARAM(STRING, param.path);
FUNCTION_LOG_PARAM(HTTP_HEADER, param.header);
FUNCTION_LOG_PARAM(HTTP_QUERY, param.query);
FUNCTION_LOG_PARAM(BUFFER, param.content);
@ -304,7 +304,7 @@ storageAzureRequest(StorageAzure *this, const String *verb, StorageAzureRequestP
HTTP_RESPONSE,
storageAzureResponseP(
storageAzureRequestAsyncP(
this, verb, .uri = param.uri, .header = param.header, .query = param.query, .content = param.content),
this, verb, .path = param.path, .header = param.header, .query = param.query, .content = param.content),
.allowMissing = param.allowMissing, .contentIo = param.contentIo));
}
@ -474,7 +474,7 @@ storageAzureInfo(THIS_VOID, const String *file, StorageInfoLevel level, StorageI
ASSERT(file != NULL);
// Attempt to get file info
HttpResponse *httpResponse = storageAzureRequestP(this, HTTP_VERB_HEAD_STR, .uri = file, .allowMissing = true);
HttpResponse *httpResponse = storageAzureRequestP(this, HTTP_VERB_HEAD_STR, .path = file, .allowMissing = true);
// Does the file exist?
StorageInfo result = {.level = level, .exists = httpResponseCodeOk(httpResponse)};
@ -765,7 +765,7 @@ storageAzureNew(
.account = strDup(account),
.blockSize = blockSize,
.host = host == NULL ? strNewFmt("%s.%s", strZ(account), strZ(endpoint)) : host,
.uriPrefix = host == NULL ? strNewFmt("/%s", strZ(container)) : strNewFmt("/%s/%s", strZ(account), strZ(container)),
.pathPrefix = host == NULL ? strNewFmt("/%s", strZ(container)) : strNewFmt("/%s/%s", strZ(account), strZ(container)),
};
// Store shared key or parse sas query

View File

@ -29,13 +29,13 @@ Perform an Azure Request
typedef struct StorageAzureRequestAsyncParam
{
VAR_PARAM_HEADER;
const String *uri; // Request URI
const String *path; // Request path
const HttpHeader *header; // Request headers
const HttpQuery *query; // Query parameters
const Buffer *content; // Request content
} StorageAzureRequestAsyncParam;
#define storageAzureRequestAsyncP(this, verb, ...) \
#define storageAzureRequestAsyncP(this, verb, ...) \
storageAzureRequestAsync(this, verb, (StorageAzureRequestAsyncParam){VAR_PARAM_INIT, __VA_ARGS__})
HttpRequest *storageAzureRequestAsync(StorageAzure *this, const String *verb, StorageAzureRequestAsyncParam param);
@ -56,7 +56,7 @@ HttpResponse *storageAzureResponse(HttpRequest *request, StorageAzureResponsePar
typedef struct StorageAzureRequestParam
{
VAR_PARAM_HEADER;
const String *uri; // Request URI
const String *path; // Request path
const HttpHeader *header; // Request headers
const HttpQuery *query; // Query parameters
const Buffer *content; // Request content

View File

@ -148,7 +148,7 @@ storageWriteAzureBlockAsync(StorageWriteAzure *this)
MEM_CONTEXT_BEGIN(this->memContext)
{
this->request = storageAzureRequestAsyncP(
this->storage, HTTP_VERB_PUT_STR, .uri = this->interface.name, .query = query, .content = this->blockBuffer);
this->storage, HTTP_VERB_PUT_STR, .path = this->interface.name, .query = query, .content = this->blockBuffer);
}
MEM_CONTEXT_END();
@ -239,7 +239,7 @@ storageWriteAzureClose(THIS_VOID)
// Finalize the multi-block upload
storageAzureRequestP(
this->storage, HTTP_VERB_PUT_STR, .uri = this->interface.name,
this->storage, HTTP_VERB_PUT_STR, .path = this->interface.name,
.query = httpQueryAdd(httpQueryNewP(), AZURE_QUERY_COMP_STR, AZURE_QUERY_VALUE_BLOCK_LIST_STR),
.content = xmlDocumentBuf(blockXml));
}
@ -247,7 +247,7 @@ storageWriteAzureClose(THIS_VOID)
else
{
storageAzureRequestP(
this->storage, HTTP_VERB_PUT_STR, .uri = this->interface.name,
this->storage, HTTP_VERB_PUT_STR, .path = this->interface.name,
httpHeaderAdd(httpHeaderNew(NULL), AZURE_HEADER_BLOB_TYPE_STR, AZURE_HEADER_VALUE_BLOCK_BLOB_STR),
.content = this->blockBuffer);
}

View File

@ -74,7 +74,7 @@ Documentation for the response format is found at: https://docs.aws.amazon.com/A
***********************************************************************************************************************************/
STRING_STATIC(S3_CREDENTIAL_HOST_STR, "169.254.169.254");
#define S3_CREDENTIAL_PORT 80
#define S3_CREDENTIAL_URI "/latest/meta-data/iam/security-credentials"
#define S3_CREDENTIAL_PATH "/latest/meta-data/iam/security-credentials"
#define S3_CREDENTIAL_RENEW_SEC (5 * 60)
VARIANT_STRDEF_STATIC(S3_JSON_TAG_ACCESS_KEY_ID_VAR, "AccessKeyId");
@ -163,13 +163,13 @@ Based on the excellent documentation at http://docs.aws.amazon.com/AmazonS3/late
***********************************************************************************************************************************/
static void
storageS3Auth(
StorageS3 *this, const String *verb, const String *uri, const HttpQuery *query, const String *dateTime,
StorageS3 *this, const String *verb, const String *path, const HttpQuery *query, const String *dateTime,
HttpHeader *httpHeader, const String *payloadHash)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STORAGE_S3, this);
FUNCTION_TEST_PARAM(STRING, verb);
FUNCTION_TEST_PARAM(STRING, uri);
FUNCTION_TEST_PARAM(STRING, path);
FUNCTION_TEST_PARAM(HTTP_QUERY, query);
FUNCTION_TEST_PARAM(STRING, dateTime);
FUNCTION_TEST_PARAM(KEY_VALUE, httpHeader);
@ -177,7 +177,7 @@ storageS3Auth(
FUNCTION_TEST_END();
ASSERT(verb != NULL);
ASSERT(uri != NULL);
ASSERT(path != NULL);
ASSERT(dateTime != NULL);
ASSERT(httpHeader != NULL);
ASSERT(payloadHash != NULL);
@ -200,7 +200,7 @@ storageS3Auth(
String *signedHeaders = NULL;
String *canonicalRequest = strNewFmt(
"%s\n%s\n%s\n", strZ(verb), strZ(uri), query == NULL ? "" : strZ(httpQueryRenderP(query)));
"%s\n%s\n%s\n", strZ(verb), strZ(path), query == NULL ? "" : strZ(httpQueryRenderP(query)));
for (unsigned int headerIdx = 0; headerIdx < strLstSize(headerList); headerIdx++)
{
@ -278,19 +278,19 @@ storageS3CvtTime(const String *time)
}
HttpRequest *
storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, StorageS3RequestAsyncParam param)
storageS3RequestAsync(StorageS3 *this, const String *verb, const String *path, StorageS3RequestAsyncParam param)
{
FUNCTION_LOG_BEGIN(logLevelDebug);
FUNCTION_LOG_PARAM(STORAGE_S3, this);
FUNCTION_LOG_PARAM(STRING, verb);
FUNCTION_LOG_PARAM(STRING, uri);
FUNCTION_LOG_PARAM(STRING, path);
FUNCTION_LOG_PARAM(HTTP_QUERY, param.query);
FUNCTION_LOG_PARAM(BUFFER, param.content);
FUNCTION_LOG_END();
ASSERT(this != NULL);
ASSERT(verb != NULL);
ASSERT(uri != NULL);
ASSERT(path != NULL);
HttpRequest *result = NULL;
@ -313,7 +313,7 @@ storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, St
// When using path-style URIs the bucket name needs to be prepended
if (this->uriStyle == storageS3UriStylePath)
uri = strNewFmt("/%s%s", strZ(this->bucket), strZ(uri));
path = strNewFmt("/%s%s", strZ(this->bucket), strZ(path));
// If temp crendentials will be expiring soon then renew them
if (this->keyType == storageS3KeyTypeAuto && (this->credExpirationTime - time(NULL)) < S3_CREDENTIAL_RENEW_SEC)
@ -328,7 +328,7 @@ storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, St
{
// Request the role
HttpRequest *request = httpRequestNewP(
this->credHttpClient, HTTP_VERB_GET_STR, STRDEF(S3_CREDENTIAL_URI), .header = credHeader);
this->credHttpClient, HTTP_VERB_GET_STR, STRDEF(S3_CREDENTIAL_PATH), .header = credHeader);
HttpResponse *response = httpRequestResponse(request, true);
// Not found likely means no role is associated with this instance
@ -353,7 +353,7 @@ storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, St
// Retrieve the temp credentials
HttpRequest *request = httpRequestNewP(
this->credHttpClient, HTTP_VERB_GET_STR, strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(this->credRole)),
this->credHttpClient, HTTP_VERB_GET_STR, strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(this->credRole)),
.header = credHeader);
HttpResponse *response = httpRequestResponse(request, true);
@ -409,7 +409,7 @@ storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, St
// Generate authorization header
storageS3Auth(
this, verb, httpUriEncode(uri, true), param.query, storageS3DateTime(time(NULL)), requestHeader,
this, verb, httpUriEncode(path, true), param.query, storageS3DateTime(time(NULL)), requestHeader,
param.content == NULL || bufEmpty(param.content) ?
HASH_TYPE_SHA256_ZERO_STR : bufHex(cryptoHashOne(HASH_TYPE_SHA256_STR, param.content)));
@ -417,7 +417,7 @@ storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, St
MEM_CONTEXT_PRIOR_BEGIN()
{
result = httpRequestNewP(
this->httpClient, verb, uri, .query = param.query, .header = requestHeader, .content = param.content);
this->httpClient, verb, path, .query = param.query, .header = requestHeader, .content = param.content);
}
MEM_CONTEXT_END();
}
@ -457,12 +457,12 @@ storageS3Response(HttpRequest *request, StorageS3ResponseParam param)
}
HttpResponse *
storageS3Request(StorageS3 *this, const String *verb, const String *uri, StorageS3RequestParam param)
storageS3Request(StorageS3 *this, const String *verb, const String *path, StorageS3RequestParam param)
{
FUNCTION_LOG_BEGIN(logLevelDebug);
FUNCTION_LOG_PARAM(STORAGE_S3, this);
FUNCTION_LOG_PARAM(STRING, verb);
FUNCTION_LOG_PARAM(STRING, uri);
FUNCTION_LOG_PARAM(STRING, path);
FUNCTION_LOG_PARAM(HTTP_QUERY, param.query);
FUNCTION_LOG_PARAM(BUFFER, param.content);
FUNCTION_LOG_PARAM(BOOL, param.allowMissing);
@ -472,7 +472,7 @@ storageS3Request(StorageS3 *this, const String *verb, const String *uri, Storage
FUNCTION_LOG_RETURN(
HTTP_RESPONSE,
storageS3ResponseP(
storageS3RequestAsyncP(this, verb, uri, .query = param.query, .content = param.content),
storageS3RequestAsyncP(this, verb, path, .query = param.query, .content = param.content),
.allowMissing = param.allowMissing, .contentIo = param.contentIo));
}

View File

@ -23,10 +23,10 @@ typedef struct StorageS3RequestAsyncParam
const Buffer *content; // Request content
} StorageS3RequestAsyncParam;
#define storageS3RequestAsyncP(this, verb, uri, ...) \
storageS3RequestAsync(this, verb, uri, (StorageS3RequestAsyncParam){VAR_PARAM_INIT, __VA_ARGS__})
#define storageS3RequestAsyncP(this, verb, path, ...) \
storageS3RequestAsync(this, verb, path, (StorageS3RequestAsyncParam){VAR_PARAM_INIT, __VA_ARGS__})
HttpRequest *storageS3RequestAsync(StorageS3 *this, const String *verb, const String *uri, StorageS3RequestAsyncParam param);
HttpRequest *storageS3RequestAsync(StorageS3 *this, const String *verb, const String *path, StorageS3RequestAsyncParam param);
// Get async response
typedef struct StorageS3ResponseParam
@ -51,10 +51,10 @@ typedef struct StorageS3RequestParam
bool contentIo; // Is IoRead interface required to read content?
} StorageS3RequestParam;
#define storageS3RequestP(this, verb, uri, ...) \
storageS3Request(this, verb, uri, (StorageS3RequestParam){VAR_PARAM_INIT, __VA_ARGS__})
#define storageS3RequestP(this, verb, path, ...) \
storageS3Request(this, verb, path, (StorageS3RequestParam){VAR_PARAM_INIT, __VA_ARGS__})
HttpResponse *storageS3Request(StorageS3 *this, const String *verb, const String *uri, StorageS3RequestParam param);
HttpResponse *storageS3Request(StorageS3 *this, const String *verb, const String *path, StorageS3RequestParam param);
/***********************************************************************************************************************************
Macros for function logging

View File

@ -392,7 +392,7 @@ testRun(void)
MEM_CONTEXT_TEMP_END();
TEST_RESULT_STR_Z(httpRequestVerb(request), "GET", "check request verb");
TEST_RESULT_STR_Z(httpRequestUri(request), "/", "check request uri");
TEST_RESULT_STR_Z(httpRequestPath(request), "/", "check request path");
TEST_RESULT_STR_Z(
httpQueryRenderP(httpRequestQuery(request)), "name=%2Fpath%2FA%20Z.txt&type=test", "check request query");
TEST_RESULT_PTR_NE(httpRequestHeader(request), NULL, "check request headers");
@ -489,7 +489,7 @@ testRun(void)
TEST_ERROR(
httpRequestError(request, response), ProtocolError,
"HTTP request failed with 404 (Not Found):\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/");
// -----------------------------------------------------------------------------------------------------------------
@ -520,7 +520,7 @@ testRun(void)
TEST_ERROR(
httpRequestError(request, response), ProtocolError,
"HTTP request failed with 403:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/?a=b\n"
"*** Request Headers ***:\n"
"hdr1: 1\n"

View File

@ -33,11 +33,11 @@ typedef struct TestRequestParam
const char *blobType;
} TestRequestParam;
#define testRequestP(write, verb, uri, ...) \
testRequest(write, verb, uri, (TestRequestParam){VAR_PARAM_INIT, __VA_ARGS__})
#define testRequestP(write, verb, path, ...) \
testRequest(write, verb, path, (TestRequestParam){VAR_PARAM_INIT, __VA_ARGS__})
static void
testRequest(IoWrite *write, const char *verb, const char *uri, TestRequestParam param)
testRequest(IoWrite *write, const char *verb, const char *path, TestRequestParam param)
{
String *request = strNewFmt("%s /" TEST_ACCOUNT "/" TEST_CONTAINER, verb);
@ -45,20 +45,20 @@ testRequest(IoWrite *write, const char *verb, const char *uri, TestRequestParam
if (driver->sasKey != NULL)
{
HttpQuery *query = httpQueryNewP();
StringList *uriQuery = strLstNewSplitZ(STR(uri), "?");
StringList *pathQuery = strLstNewSplitZ(STR(path), "?");
if (strLstSize(uriQuery) == 2)
query = httpQueryNewStr(strLstGet(uriQuery, 1));
if (strLstSize(pathQuery) == 2)
query = httpQueryNewStr(strLstGet(pathQuery, 1));
httpQueryMerge(query, driver->sasKey);
strCat(request, strLstGet(uriQuery, 0));
strCat(request, strLstGet(pathQuery, 0));
strCatZ(request, "?");
strCat(request, httpQueryRenderP(query));
}
// Else just output URI as is
// Else just output path as is
else
strCatZ(request, uri);
strCatZ(request, path);
// Add HTTP version and user agent
strCatZ(request, " HTTP/1.1\r\nuser-agent:" PROJECT_NAME "/" PROJECT_VERSION "\r\n");
@ -192,7 +192,7 @@ testRun(void)
TEST_RESULT_STR(((StorageAzure *)storage->driver)->container, TEST_CONTAINER_STR, " check container");
TEST_RESULT_STR(((StorageAzure *)storage->driver)->sharedKey, TEST_KEY_SHARED_STR, " check key");
TEST_RESULT_STR_Z(((StorageAzure *)storage->driver)->host, TEST_ACCOUNT ".blob.core.windows.net", " check host");
TEST_RESULT_STR_Z(((StorageAzure *)storage->driver)->uriPrefix, "/" TEST_CONTAINER, " check uri prefix");
TEST_RESULT_STR_Z(((StorageAzure *)storage->driver)->pathPrefix, "/" TEST_CONTAINER, " check path prefix");
TEST_RESULT_UINT(((StorageAzure *)storage->driver)->blockSize, STORAGE_AZURE_BLOCKSIZE_MIN, " check block size");
TEST_RESULT_BOOL(storageFeature(storage, storageFeaturePath), false, " check path feature");
TEST_RESULT_BOOL(storageFeature(storage, storageFeatureCompress), false, " check compress feature");
@ -299,7 +299,7 @@ testRun(void)
driver = (StorageAzure *)storage->driver;
TEST_RESULT_STR(driver->host, hrnServerHost(), " check host");
TEST_RESULT_STR_Z(driver->uriPrefix, "/" TEST_ACCOUNT "/" TEST_CONTAINER, " check uri prefix");
TEST_RESULT_STR_Z(driver->pathPrefix, "/" TEST_ACCOUNT "/" TEST_CONTAINER, " check path prefix");
TEST_RESULT_BOOL(driver->fileId == 0, false, " check file id");
// Tests need the block size to be 16
@ -357,7 +357,7 @@ testRun(void)
TEST_ERROR_FMT(
ioReadOpen(storageReadIo(read)), ProtocolError,
"HTTP request failed with 303:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/account/container/file.txt\n"
"*** Request Headers ***:\n"
"authorization: <redacted>\n"
@ -380,7 +380,7 @@ testRun(void)
TEST_ERROR_FMT(
storagePutP(storageNewWriteP(storage, strNew("file.txt")), BUFSTRDEF("ABCD")), ProtocolError,
"HTTP request failed with 403 (Forbidden):\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/account/container/file.txt\n"
"*** Request Headers ***:\n"
"authorization: <redacted>\n"
@ -759,7 +759,7 @@ testRun(void)
TEST_ERROR_FMT(
storagePathRemoveP(storage, strNew("/"), .recurse = true), ProtocolError,
"HTTP request failed with 403 (Forbidden):\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/account/container?comp=list&restype=container&sig=<redacted>\n"
"*** Request Headers ***:\n"
"content-length: 0\n"

View File

@ -28,11 +28,11 @@ typedef struct TestRequestParam
const char *securityToken;
} TestRequestParam;
#define testRequestP(write, s3, verb, uri, ...) \
testRequest(write, s3, verb, uri, (TestRequestParam){VAR_PARAM_INIT, __VA_ARGS__})
#define testRequestP(write, s3, verb, path, ...) \
testRequest(write, s3, verb, path, (TestRequestParam){VAR_PARAM_INIT, __VA_ARGS__})
static void
testRequest(IoWrite *write, Storage *s3, const char *verb, const char *uri, TestRequestParam param)
testRequest(IoWrite *write, Storage *s3, const char *verb, const char *path, TestRequestParam param)
{
// Get security token from param
const char *securityToken = param.securityToken == NULL ? NULL : param.securityToken;
@ -50,7 +50,7 @@ testRequest(IoWrite *write, Storage *s3, const char *verb, const char *uri, Test
}
// Add request
String *request = strNewFmt("%s %s HTTP/1.1\r\nuser-agent:" PROJECT_NAME "/" PROJECT_VERSION "\r\n", verb, uri);
String *request = strNewFmt("%s %s HTTP/1.1\r\nuser-agent:" PROJECT_NAME "/" PROJECT_VERSION "\r\n", verb, path);
// Add authorization header when s3 service
if (s3 != NULL)
@ -471,7 +471,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_URI);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_PATH);
testResponseP(auth, .http = "1.0", .code = 301);
hrnServerScriptClose(auth);
@ -479,7 +479,7 @@ testRun(void)
TEST_ERROR_FMT(
storageGetP(storageNewReadP(s3, strNew("file.txt"))), ProtocolError,
"HTTP request failed with 301:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/latest/meta-data/iam/security-credentials\n"
"*** Request Headers ***:\n"
"content-length: 0\n"
@ -491,7 +491,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_URI);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_PATH);
testResponseP(auth, .http = "1.0", .code = 404);
hrnServerScriptClose(auth);
@ -506,13 +506,13 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_URI);
testRequestP(auth, NULL, HTTP_VERB_GET, S3_CREDENTIAL_PATH);
testResponseP(auth, .http = "1.0", .content = strZ(credRole));
hrnServerScriptClose(auth);
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(credRole))));
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(credRole))));
testResponseP(auth, .http = "1.0", .code = 300);
hrnServerScriptClose(auth);
@ -520,7 +520,7 @@ testRun(void)
TEST_ERROR_FMT(
storageGetP(storageNewReadP(s3, strNew("file.txt"))), ProtocolError,
"HTTP request failed with 300:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/latest/meta-data/iam/security-credentials/credrole\n"
"*** Request Headers ***:\n"
"content-length: 0\n"
@ -532,7 +532,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(credRole))));
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(credRole))));
testResponseP(auth, .http = "1.0", .code = 404);
hrnServerScriptClose(auth);
@ -548,7 +548,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(credRole))));
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(credRole))));
testResponseP(auth, .http = "1.0", .content = "{\"Code\":\"IAM role is not configured\"}");
hrnServerScriptClose(auth);
@ -562,7 +562,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(credRole))));
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(credRole))));
testResponseP(
auth,
.content = strZ(
@ -584,7 +584,7 @@ testRun(void)
TEST_ERROR(
ioReadOpen(storageReadIo(read)), ProtocolError,
"HTTP request failed with 303:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/file.txt\n"
"*** Request Headers ***:\n"
"authorization: <redacted>\n"
@ -608,7 +608,7 @@ testRun(void)
hrnServerScriptAccept(auth);
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_URI "/%s", strZ(credRole))));
testRequestP(auth, NULL, HTTP_VERB_GET, strZ(strNewFmt(S3_CREDENTIAL_PATH "/%s", strZ(credRole))));
testResponseP(
auth,
.content = strZ(
@ -782,7 +782,7 @@ testRun(void)
TEST_ERROR(storageListP(s3, strNew("/")), ProtocolError,
"HTTP request failed with 344:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/?delimiter=%2F&list-type=2\n"
"*** Request Headers ***:\n"
"authorization: <redacted>\n"
@ -806,7 +806,7 @@ testRun(void)
TEST_ERROR(storageListP(s3, strNew("/")), ProtocolError,
"HTTP request failed with 344:\n"
"*** URI/Query ***:\n"
"*** Path/Query ***:\n"
"/?delimiter=%2F&list-type=2\n"
"*** Request Headers ***:\n"
"authorization: <redacted>\n"