blob: 4639fc2afc3c62164183c4c49ddad166cbb8f51f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.flink.statefun.flink.core.httpfn;
import java.io.IOException;
import java.time.Duration;
import java.util.Objects;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonSetter;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.core.JsonParser;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.DeserializationContext;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import org.apache.flink.util.TimeUtils;
public final class DefaultHttpRequestReplyClientSpec {
@JsonProperty("timeouts")
private Timeouts timeouts = new Timeouts();
@JsonSetter("timeouts")
public void setTimeouts(Timeouts timeouts) {
validateTimeouts(
timeouts.callTimeout, timeouts.connectTimeout, timeouts.readTimeout, timeouts.writeTimeout);
this.timeouts = timeouts;
}
public Timeouts getTimeouts() {
return timeouts;
}
private static void validateTimeouts(
Duration callTimeout, Duration connectTimeout, Duration readTimeout, Duration writeTimeout) {
if (connectTimeout.compareTo(callTimeout) > 0) {
throw new IllegalArgumentException("Connect timeout cannot be larger than request timeout.");
}
if (readTimeout.compareTo(callTimeout) > 0) {
throw new IllegalArgumentException("Read timeout cannot be larger than request timeout.");
}
if (writeTimeout.compareTo(callTimeout) > 0) {
throw new IllegalArgumentException("Write timeout cannot be larger than request timeout.");
}
}
public static final class Timeouts {
private static final Duration DEFAULT_HTTP_TIMEOUT = Duration.ofMinutes(1);
private static final Duration DEFAULT_HTTP_CONNECT_TIMEOUT = Duration.ofSeconds(10);
private static final Duration DEFAULT_HTTP_READ_TIMEOUT = Duration.ofSeconds(10);
private static final Duration DEFAULT_HTTP_WRITE_TIMEOUT = Duration.ofSeconds(10);
private Duration callTimeout = DEFAULT_HTTP_TIMEOUT;
private Duration connectTimeout = DEFAULT_HTTP_CONNECT_TIMEOUT;
private Duration readTimeout = DEFAULT_HTTP_READ_TIMEOUT;
private Duration writeTimeout = DEFAULT_HTTP_WRITE_TIMEOUT;
@JsonSetter("call")
@JsonDeserialize(using = DurationJsonDeserialize.class)
public void setCallTimeout(Duration callTimeout) {
this.callTimeout = requireNonZeroDuration(callTimeout);
}
@JsonSetter("connect")
@JsonDeserialize(using = DurationJsonDeserialize.class)
public void setConnectTimeout(Duration connectTimeout) {
this.connectTimeout = requireNonZeroDuration(connectTimeout);
}
@JsonSetter("read")
@JsonDeserialize(using = DurationJsonDeserialize.class)
public void setReadTimeout(Duration readTimeout) {
this.readTimeout = requireNonZeroDuration(readTimeout);
}
@JsonSetter("write")
@JsonDeserialize(using = DurationJsonDeserialize.class)
public void setWriteTimeout(Duration writeTimeout) {
this.writeTimeout = requireNonZeroDuration(writeTimeout);
}
public Duration getCallTimeout() {
return callTimeout;
}
public Duration getConnectTimeout() {
return connectTimeout;
}
public Duration getReadTimeout() {
return readTimeout;
}
public Duration getWriteTimeout() {
return writeTimeout;
}
private static Duration requireNonZeroDuration(Duration duration) {
Objects.requireNonNull(duration);
if (duration.equals(Duration.ZERO)) {
throw new IllegalArgumentException("Timeout durations must be larger than 0.");
}
return duration;
}
}
private static final class DurationJsonDeserialize extends JsonDeserializer<Duration> {
@Override
public Duration deserialize(
JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
return TimeUtils.parseDuration(jsonParser.getText());
}
}
}