|
|
|
@ -44,6 +44,9 @@ static int64_t round_up_to_three_sig_figs(int64_t x) { |
|
|
|
|
/* encode our minimum viable timeout value */ |
|
|
|
|
static void enc_tiny(char* buffer) { memcpy(buffer, "1n", 3); } |
|
|
|
|
|
|
|
|
|
/* encode our maximum timeout value, about 1157 days */ |
|
|
|
|
static void enc_huge(char* buffer) { memcpy(buffer, "99999999S", 10); } |
|
|
|
|
|
|
|
|
|
static void enc_ext(char* buffer, int64_t value, char ext) { |
|
|
|
|
int n = int64_ttoa(value, buffer); |
|
|
|
|
buffer[n] = ext; |
|
|
|
@ -51,6 +54,7 @@ static void enc_ext(char* buffer, int64_t value, char ext) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void enc_seconds(char* buffer, int64_t sec) { |
|
|
|
|
sec = round_up_to_three_sig_figs(sec); |
|
|
|
|
if (sec % 3600 == 0) { |
|
|
|
|
enc_ext(buffer, sec / 3600, 'H'); |
|
|
|
|
} else if (sec % 60 == 0) { |
|
|
|
@ -74,10 +78,13 @@ static void enc_millis(char* buffer, int64_t x) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void grpc_http2_encode_timeout(grpc_millis timeout, char* buffer) { |
|
|
|
|
const grpc_millis kMaxTimeout = 99999999000; |
|
|
|
|
if (timeout <= 0) { |
|
|
|
|
enc_tiny(buffer); |
|
|
|
|
} else if (timeout < 1000 * GPR_MS_PER_SEC) { |
|
|
|
|
enc_millis(buffer, timeout); |
|
|
|
|
} else if (timeout >= kMaxTimeout) { |
|
|
|
|
enc_huge(buffer); |
|
|
|
|
} else { |
|
|
|
|
enc_seconds(buffer, |
|
|
|
|
timeout / GPR_MS_PER_SEC + (timeout % GPR_MS_PER_SEC != 0)); |
|
|
|
|