Skip to content

Commit 747ced3

Browse files
SNOW-1997074 handle HTTP 307&308 redirect (#941)
1 parent ae214ce commit 747ced3

23 files changed

+1124
-26
lines changed

ci/test/test.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ set -o pipefail
1111
source $SCRIPTS_DIR/_init.sh -t $BUILD_TYPE
1212
echo "CMAKE: $CMAKE, CTEST: $CTEST"
1313
source $SCRIPTS_DIR/utils.sh
14+
if [ "$(uname)" == "Linux" ]; then
15+
source $SCRIPTS_DIR/setup_wiremock.sh
16+
fi
1417

1518
init_git_variables
1619
set_parameters $CLOUD_PROVIDER

cpp/StatementPutGet.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ bool StatementPutGet::http_put(std::string const& url,
192192
sf_bool success = SF_BOOLEAN_FALSE;
193193

194194
success = http_perform(curl, PUT_REQUEST_TYPE, urlbuf, &reqHeaders, NULL, &putPayload, NULL,
195-
NULL, &respHeaders, get_retry_timeout(sf),
195+
NULL, &respHeaders, get_retry_timeout(sf), get_retry_timeout(sf),
196196
SF_BOOLEAN_FALSE, &m_stmt->error, sf->insecure_mode,sf->ocsp_fail_open,
197197
sf->crl_check, sf->crl_advisory, sf->crl_allow_no_crl,
198198
sf->crl_disk_caching, sf->crl_memory_caching,
@@ -255,7 +255,7 @@ bool StatementPutGet::http_get(std::string const& url,
255255
sf_bool success = SF_BOOLEAN_FALSE;
256256

257257
success = http_perform(curl, reqType, urlbuf, &reqHeaders, NULL, NULL, NULL,
258-
&resp, &respHeaders, get_retry_timeout(sf),
258+
&resp, &respHeaders, get_retry_timeout(sf), get_retry_timeout(sf),
259259
SF_BOOLEAN_FALSE, &m_stmt->error, sf->insecure_mode, sf->ocsp_fail_open,
260260
sf->crl_check, sf->crl_advisory, sf->crl_allow_no_crl,
261261
sf->crl_disk_caching, sf->crl_memory_caching,

cpp/lib/Authenticator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ namespace Client
568568
if (parseJSON)
569569
{
570570
isHttpSuccess = http_perform(curl, GET_REQUEST_TYPE, (char*)destination.c_str(), httpExtraHeaders, NULL, NULL, &resp_data,
571-
raw_resp, NULL, curlTimeout, SF_BOOLEAN_FALSE, err,
571+
raw_resp, NULL, m_retryTimeout, curlTimeout, SF_BOOLEAN_FALSE, err,
572572
m_connection->insecure_mode, m_connection->ocsp_fail_open,
573573
m_connection->crl_check, m_connection->crl_advisory, m_connection->crl_allow_no_crl,
574574
m_connection->crl_disk_caching, m_connection->crl_memory_caching,
@@ -579,7 +579,7 @@ namespace Client
579579
else
580580
{
581581
isHttpSuccess = http_perform(curl, GET_REQUEST_TYPE, (char*)destination.c_str(), httpExtraHeaders, NULL, NULL, NULL,
582-
raw_resp, NULL, curlTimeout, SF_BOOLEAN_FALSE, err,
582+
raw_resp, NULL, m_retryTimeout, curlTimeout, SF_BOOLEAN_FALSE, err,
583583
m_connection->insecure_mode, m_connection->ocsp_fail_open,
584584
m_connection->crl_check, m_connection->crl_advisory, m_connection->crl_allow_no_crl,
585585
m_connection->crl_disk_caching, m_connection->crl_memory_caching,

cpp/util/CurlDesc.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ namespace Client
6464
curl_easy_reset(m_curl);
6565
CXX_LOG_TRACE("CurDesc::reset(): curl_easy_reset %p", m_curl);
6666
}
67+
68+
// allow redirect
69+
curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, true);
6770
}
6871

6972
}

include/snowflake/client.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ extern "C" {
8282
*/
8383
#define SF_RETRY_TIMEOUT 300
8484

85+
/**
86+
* network timeout in seconds
87+
*/
88+
#define SF_NETWORK_TIMEOUT 90
89+
8590
/**
8691
* CRL download timeout in seconds
8792
*/

lib/chunk_downloader.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ sf_bool STDCALL download_chunk(char *url, SF_HEADER *headers,
212212
long crl_download_timeout,
213213
const char *proxy,
214214
const char *no_proxy,
215-
int64 network_timeout, int8 retry_max_count) {
215+
int64 retry_timeout, int8 retry_max_count) {
216216
sf_bool ret = SF_BOOLEAN_FALSE;
217217
void* curl_desc = get_curl_desc_from_pool(url, proxy, no_proxy);
218218
CURL *curl = get_curl_from_desc(curl_desc);
219219

220220
if (!curl ||
221221
!http_perform(curl, GET_REQUEST_TYPE, url, headers, NULL, NULL, chunk,
222-
non_json_resp, NULL, network_timeout,
222+
non_json_resp, NULL, retry_timeout, retry_timeout,
223223
SF_BOOLEAN_TRUE, error, insecure_mode, fail_open,
224224
crl_check, crl_advisory, crl_allow_no_crl,
225225
crl_disk_caching, crl_memory_caching,
@@ -255,7 +255,7 @@ SF_CHUNK_DOWNLOADER *STDCALL chunk_downloader_init(const char *qrmk,
255255
NON_JSON_RESP* (*callback_create_resp)(void),
256256
const char *proxy,
257257
const char *no_proxy,
258-
int64 network_timeout,
258+
int64 retry_timeout,
259259
int8 retry_max_count) {
260260
struct SF_CHUNK_DOWNLOADER *chunk_downloader = NULL;
261261
const char *error_msg = NULL;
@@ -299,7 +299,7 @@ SF_CHUNK_DOWNLOADER *STDCALL chunk_downloader_init(const char *qrmk,
299299
chunk_downloader->callback_create_resp = callback_create_resp;
300300
chunk_downloader->proxy = NULL;
301301
chunk_downloader->no_proxy = NULL;
302-
chunk_downloader->network_timeout = network_timeout;
302+
chunk_downloader->retry_timeout = retry_timeout;
303303
chunk_downloader->retry_max_count = retry_max_count;
304304

305305
// Initialize chunk_headers or qrmk
@@ -507,7 +507,7 @@ static void * chunk_downloader_thread(void *downloader) {
507507
chunk_downloader->crl_check, chunk_downloader->crl_advisory, chunk_downloader->crl_allow_no_crl,
508508
chunk_downloader->crl_disk_caching, chunk_downloader-> crl_memory_caching,
509509
chunk_downloader->crl_download_timeout, chunk_downloader->proxy,
510-
chunk_downloader->no_proxy, chunk_downloader->network_timeout, chunk_downloader->retry_max_count)) {
510+
chunk_downloader->no_proxy, chunk_downloader->retry_timeout, chunk_downloader->retry_max_count)) {
511511
_rwlock_wrlock(&chunk_downloader->attr_lock);
512512
if (!chunk_downloader->has_error) {
513513
copy_snowflake_error(chunk_downloader->sf_error, &err);

lib/chunk_downloader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct SF_CHUNK_DOWNLOADER {
7979
char *no_proxy;
8080

8181
// retry settings
82-
int64 network_timeout;
82+
int64 retry_timeout;
8383
int8 retry_max_count;
8484
};
8585

@@ -100,7 +100,7 @@ SF_CHUNK_DOWNLOADER *STDCALL chunk_downloader_init(const char *qrmk,
100100
NON_JSON_RESP* (*callback_create_resp)(void),
101101
const char *proxy,
102102
const char *no_proxy,
103-
int64 network_timeout,
103+
int64 retry_timeout,
104104
int8 retry_max_count);
105105
sf_bool STDCALL chunk_downloader_term(SF_CHUNK_DOWNLOADER *chunk_downloader);
106106
sf_bool STDCALL get_shutdown_or_error(SF_CHUNK_DOWNLOADER *chunk_downloader);

lib/client.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ SF_CONNECT *STDCALL snowflake_init() {
10461046
sf->token = NULL;
10471047
sf->master_token = NULL;
10481048
sf->login_timeout = SF_LOGIN_TIMEOUT;
1049-
sf->network_timeout = 0;
1049+
sf->network_timeout = SF_NETWORK_TIMEOUT;
10501050
sf->browser_response_timeout = SF_BROWSER_RESPONSE_TIMEOUT;
10511051
sf->retry_timeout = SF_RETRY_TIMEOUT;
10521052
sf->sequence_counter = 0;
@@ -1522,7 +1522,7 @@ SF_STATUS STDCALL snowflake_set_attribute(
15221522
sf->login_timeout = value ? *((int64 *) value) : SF_LOGIN_TIMEOUT;
15231523
break;
15241524
case SF_CON_NETWORK_TIMEOUT:
1525-
sf->network_timeout = value ? *((int64 *) value) : SF_LOGIN_TIMEOUT;
1525+
sf->network_timeout = value ? *((int64 *) value) : SF_NETWORK_TIMEOUT;
15261526
break;
15271527
case SF_CON_BROWSER_RESPONSE_TIMEOUT:
15281528
sf->browser_response_timeout = value ? *((int64*)value) : SF_BROWSER_RESPONSE_TIMEOUT;

lib/connection.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ sf_bool STDCALL curl_post_call(SF_CONNECT *sf,
287287

288288
do {
289289
if (!http_perform(curl, POST_REQUEST_TYPE, url, header, body, NULL, json, NULL, NULL,
290-
retry_timeout, SF_BOOLEAN_FALSE, error,
290+
retry_timeout, sf->network_timeout, SF_BOOLEAN_FALSE, error,
291291
sf->insecure_mode, sf->ocsp_fail_open,
292292
sf->crl_check, sf->crl_advisory, sf->crl_allow_no_crl,
293293
sf->crl_disk_caching, sf->crl_memory_caching,
@@ -432,7 +432,7 @@ sf_bool STDCALL curl_get_call(SF_CONNECT *sf,
432432

433433
do {
434434
if (!http_perform(curl, GET_REQUEST_TYPE, url, header, NULL, NULL, json, NULL, NULL,
435-
get_retry_timeout(sf), SF_BOOLEAN_FALSE, error,
435+
get_retry_timeout(sf), sf->network_timeout, SF_BOOLEAN_FALSE, error,
436436
sf->insecure_mode, sf->ocsp_fail_open,
437437
sf->crl_check, sf->crl_advisory, sf->crl_allow_no_crl,
438438
sf->crl_disk_caching, sf->crl_memory_caching,
@@ -1295,7 +1295,7 @@ int64 get_login_timeout(SF_CONNECT *sf)
12951295

12961296
int64 get_retry_timeout(SF_CONNECT *sf)
12971297
{
1298-
return get_less_one(sf->network_timeout, sf->retry_timeout);
1298+
return sf->retry_timeout;
12991299
}
13001300

13011301
int8 get_login_retry_count(SF_CONNECT *sf)

lib/connection.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ size_t char_resp_cb(char *data, size_t size, size_t nmemb, RAW_CHAR_BUFFER *raw_
451451
* Used only when json is set to NULL.
452452
* @param resp_headers A reference to retrieve response headers. Needs to be freed with SF_FREE.
453453
* Set to NULL if it's not needed.
454+
* @param retry_timeout The retry timeout to use for all retry attempts of one request.
454455
* @param network_timeout The network request timeout to use for each request try.
455456
* @param chunk_downloader A boolean value determining whether or not we are running this request from the chunk
456457
* downloader. Each chunk that we download from AWS is invalid JSON so we need to add an
@@ -482,7 +483,7 @@ size_t char_resp_cb(char *data, size_t size, size_t nmemb, RAW_CHAR_BUFFER *raw_
482483
*/
483484
sf_bool STDCALL http_perform(CURL *curl, SF_REQUEST_TYPE request_type, char *url, SF_HEADER *header,
484485
char *body, PUT_PAYLOAD* put_payload, cJSON **json, NON_JSON_RESP* non_json_resp,
485-
char** resp_headers, int64 network_timeout, sf_bool chunk_downloader,
486+
char** resp_headers, int64 retry_timeout, int64 network_timeout, sf_bool chunk_downloader,
486487
SF_ERROR_STRUCT* error, sf_bool insecure_mode, sf_bool fail_open,
487488
sf_bool crl_check, sf_bool crl_advisory, sf_bool crl_allow_no_crl,
488489
sf_bool crl_disk_caching, sf_bool crl_memory_caching,

0 commit comments

Comments
 (0)