1   /*
2    * Copyright 2017 LINE Corporation
3    *
4    * LINE Corporation licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  
17  package com.linecorp.centraldogma.server.internal.thrift;
18  
19  import java.util.List;
20  
21  import com.linecorp.armeria.common.RpcRequest;
22  import com.linecorp.armeria.common.RpcResponse;
23  import com.linecorp.armeria.common.util.TimeoutMode;
24  import com.linecorp.armeria.server.RpcService;
25  import com.linecorp.armeria.server.ServiceRequestContext;
26  import com.linecorp.armeria.server.SimpleDecoratingRpcService;
27  import com.linecorp.centraldogma.internal.api.v1.WatchTimeout;
28  
29  public final class CentralDogmaTimeoutScheduler extends SimpleDecoratingRpcService {
30  
31      public CentralDogmaTimeoutScheduler(RpcService delegate) {
32          super(delegate);
33      }
34  
35      @Override
36      public RpcResponse serve(ServiceRequestContext ctx, RpcRequest req) throws Exception {
37          if (ctx.requestTimeoutMillis() > 0) {
38              final String method = req.method();
39              if ("watchFile".equals(method) || "watchRepository".equals(method)) {
40                  final List<Object> params = req.params();
41                  final long timeout = (Long) params.get(params.size() - 1);
42                  if (timeout > 0) {
43                      ctx.setRequestTimeoutMillis(
44                              TimeoutMode.EXTEND,
45                              WatchTimeout.availableTimeout(timeout, ctx.requestTimeoutMillis()));
46                  }
47              }
48          }
49  
50          return unwrap().serve(ctx, req);
51      }
52  }