Source File
encode_duration.go
Belonging Package
google.golang.org/grpc/internal/grpcutil
/*
*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package grpcutil
import (
)
const maxTimeoutValue int64 = 100000000 - 1
// div does integer division and round-up the result. Note that this is
// equivalent to (d+r-1)/r but has less chance to overflow.
func (, time.Duration) int64 {
if % > 0 {
return int64(/ + 1)
}
return int64( / )
}
// EncodeDuration encodes the duration to the format grpc-timeout header
// accepts.
//
// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests
func ( time.Duration) string {
// TODO: This is simplistic and not bandwidth efficient. Improve it.
if <= 0 {
return "0n"
}
if := div(, time.Nanosecond); <= maxTimeoutValue {
return strconv.FormatInt(, 10) + "n"
}
if := div(, time.Microsecond); <= maxTimeoutValue {
return strconv.FormatInt(, 10) + "u"
}
if := div(, time.Millisecond); <= maxTimeoutValue {
return strconv.FormatInt(, 10) + "m"
}
if := div(, time.Second); <= maxTimeoutValue {
return strconv.FormatInt(, 10) + "S"
}
if := div(, time.Minute); <= maxTimeoutValue {
return strconv.FormatInt(, 10) + "M"
}
// Note that maxTimeoutValue * time.Hour > MaxInt64.
return strconv.FormatInt(div(, time.Hour), 10) + "H"
}
The pages are generated with Golds v0.4.9. (GOOS=linux GOARCH=amd64)