Skip to content

Commit 3e76e32

Browse files
committed
feat(go): endpoint level timeout
1 parent 6f0f835 commit 3e76e32

File tree

5 files changed

+43
-8
lines changed

5 files changed

+43
-8
lines changed

clients/algoliasearch-client-go/algolia/transport/configuration.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,9 @@ type Configuration struct {
2020
Compression compression.Compression
2121
ExposeIntermediateNetworkErrors bool
2222
}
23+
24+
type RequestConfiguration struct {
25+
ReadTimeout *time.Duration
26+
WriteTimeout *time.Duration
27+
ConnectTimeout *time.Duration
28+
}

clients/algoliasearch-client-go/algolia/transport/transport.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func New(cfg Configuration) *Transport {
4444
return transport
4545
}
4646

47-
func (t *Transport) Request(ctx context.Context, req *http.Request, k call.Kind) (*http.Response, []byte, error) {
47+
func (t *Transport) Request(ctx context.Context, req *http.Request, k call.Kind, c *RequestConfiguration) (*http.Response, []byte, error) {
4848
var intermediateNetworkErrors []error
4949

5050
// Add Content-Encoding header, if needed
@@ -59,9 +59,28 @@ func (t *Transport) Request(ctx context.Context, req *http.Request, k call.Kind)
5959
// before the early returns, but when we do so, we do it **after**
6060
// reading the body content of the response. Otherwise, a `context
6161
// cancelled` error may happen when the body is read.
62-
perRequestCtx, cancel := context.WithTimeout(ctx, h.timeout)
62+
var (
63+
ctxTimeout time.Duration
64+
connectTimeout time.Duration
65+
)
66+
67+
if c != nil && k == call.Read && c.ReadTimeout != nil { //nolint:gocritic
68+
ctxTimeout = *c.ReadTimeout
69+
} else if c != nil && k == call.Write && c.WriteTimeout != nil {
70+
ctxTimeout = *c.WriteTimeout
71+
} else {
72+
ctxTimeout = h.timeout
73+
}
74+
75+
if c != nil && c.ConnectTimeout != nil {
76+
connectTimeout = *c.ConnectTimeout
77+
} else {
78+
connectTimeout = t.connectTimeout
79+
}
80+
81+
perRequestCtx, cancel := context.WithTimeout(ctx, ctxTimeout)
6382
req = req.WithContext(perRequestCtx)
64-
res, err := t.request(req, h, h.timeout, t.connectTimeout)
83+
res, err := t.request(req, h, ctxTimeout, connectTimeout)
6584

6685
code := 0
6786
if res != nil {

generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.algolia.codegen.exceptions.*;
44
import com.algolia.codegen.lambda.ScreamingSnakeCaseLambda;
5+
import com.algolia.codegen.lambda.ToSecondsLambda;
56
import com.algolia.codegen.utils.*;
67
import com.google.common.collect.ImmutableMap;
78
import com.google.common.collect.Iterables;
@@ -66,7 +67,12 @@ public void processOpts() {
6667

6768
@Override
6869
protected ImmutableMap.Builder<String, Mustache.Lambda> addMustacheLambdas() {
69-
return super.addMustacheLambdas().put("screamingSnakeCase", new ScreamingSnakeCaseLambda());
70+
ImmutableMap.Builder<String, Mustache.Lambda> lambdas = super.addMustacheLambdas();
71+
72+
lambdas.put("screamingSnakeCase", new ScreamingSnakeCaseLambda());
73+
lambdas.put("toSeconds", new ToSecondsLambda());
74+
75+
return lambdas;
7076
}
7177

7278
@Override

templates/go/api.mustache

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import (
1919
"errors"
2020
"slices"
2121
"sort"
22-
"time"
2322
{{/isSearchClient}}
23+
"time"
2424

2525
"github.com/algolia/algoliasearch-client-go/v4/algolia/utils"
2626
)
@@ -507,7 +507,11 @@ func (c *APIClient) {{nickname}}WithHTTPInfo({{#hasParams}}r {{#structPrefix}}{{
507507
return nil, nil, err
508508
}
509509

510-
return c.callAPI(req, {{#vendorExtensions}}{{#x-use-read-transporter}}true{{/x-use-read-transporter}}{{^x-use-read-transporter}}false{{/x-use-read-transporter}}{{/vendorExtensions}})
510+
return c.callAPI(
511+
req,
512+
{{#vendorExtensions}}{{#x-use-read-transporter}}true{{/x-use-read-transporter}}{{^x-use-read-transporter}}false{{/x-use-read-transporter}},{{/vendorExtensions}}
513+
{{#vendorExtensions.x-timeouts}}utils.ToPtr(transport.RequestConfiguration{ReadTimeout: utils.ToPtr({{#lambda.toSeconds}}{{{read}}}{{/lambda.toSeconds}} * time.Second), WriteTimeout: utils.ToPtr({{#lambda.toSeconds}}{{{write}}}{{/lambda.toSeconds}} * time.Second), ConnectTimeout: utils.ToPtr({{#lambda.toSeconds}}{{{connect}}}{{/lambda.toSeconds}} * time.Second)}){{/vendorExtensions.x-timeouts}}{{^vendorExtensions.x-timeouts}}nil{{/vendorExtensions.x-timeouts}},
514+
)
511515
}
512516

513517
/*

templates/go/client.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,13 @@ func (c *APIClient) AddDefaultHeader(key string, value string) {
129129
}
130130

131131
// callAPI do the request.
132-
func (c *APIClient) callAPI(request *http.Request, useReadTransporter bool) (*http.Response, []byte, error) {
132+
func (c *APIClient) callAPI(request *http.Request, useReadTransporter bool, requestConfiguration *transport.RequestConfiguration) (*http.Response, []byte, error) {
133133
callKind := call.Write
134134
if useReadTransporter || request.Method == http.MethodGet {
135135
callKind = call.Read
136136
}
137137

138-
resp, body, err := c.transport.Request(request.Context(), request, callKind)
138+
resp, body, err := c.transport.Request(request.Context(), request, callKind, requestConfiguration)
139139
if err != nil {
140140
return nil, nil, fmt.Errorf("failed to do request: %w", err)
141141
}

0 commit comments

Comments
 (0)