http: pass timeout using extended config

App can now pass http connection timeout using extended configuration,
ext cfg type TRANSPORT_ENDPT_EXT_CFG_HTTP, value (in seconds) set in ext
cfg member opaque.
It is optional, default value is 60 seconds.

Type: improvement

Change-Id: Ibeff4bbd3153421be350ff564ec3c8e52e5b9639
Signed-off-by: Matus Fabian <matfabia@cisco.com>
This commit is contained in:
Matus Fabian
2024-10-17 13:41:51 +02:00
committed by Florin Coras
parent dced40dcac
commit 841672258a
11 changed files with 132 additions and 18 deletions

View File

@ -32,7 +32,7 @@ func init() {
HttpInvalidContentLengthTest, HttpInvalidTargetSyntaxTest, HttpStaticPathTraversalTest, HttpUriDecodeTest,
HttpHeadersTest, HttpStaticFileHandlerTest, HttpStaticFileHandlerDefaultMaxAgeTest, HttpClientTest, HttpClientErrRespTest, HttpClientPostFormTest,
HttpClientPostFileTest, HttpClientPostFilePtrTest, AuthorityFormTargetTest, HttpRequestLineTest,
HttpStaticFileHandlerWrkTest, HttpStaticUrlHandlerWrkTest)
HttpStaticFileHandlerWrkTest, HttpStaticUrlHandlerWrkTest, HttpConnTimeoutTest)
RegisterNoTopoSoloTests(HttpStaticPromTest, HttpGetTpsTest, HttpGetTpsInterruptModeTest, PromConcurrentConnectionsTest,
PromMemLeakTest, HttpClientPostMemLeakTest, HttpInvalidClientRequestMemLeakTest, HttpPostTpsTest, HttpPostTpsInterruptModeTest,
PromConsecutiveConnectionsTest)
@ -804,10 +804,10 @@ func HttpCliBadRequestTest(s *NoTopoSuite) {
func HttpStaticBuildInUrlGetVersionTest(s *NoTopoSuite) {
vpp := s.GetContainerByName("vpp").VppInstance
serverAddress := s.VppAddr()
s.Log(vpp.Vppctl("http static server uri tcp://" + serverAddress + "/80 url-handlers debug"))
s.Log(vpp.Vppctl("http static server uri tls://" + serverAddress + "/80 url-handlers debug"))
client := NewHttpClient(defaultHttpTimeout)
req, err := http.NewRequest("GET", "http://"+serverAddress+":80/version.json", nil)
req, err := http.NewRequest("GET", "https://"+serverAddress+":80/version.json", nil)
s.AssertNil(err, fmt.Sprint(err))
resp, err := client.Do(req)
s.AssertNil(err, fmt.Sprint(err))
@ -1205,3 +1205,33 @@ func HeaderServerTest(s *NoTopoSuite) {
s.AssertHttpHeaderWithValue(resp, "Server", "http_cli_server")
s.AssertHttpHeaderWithValue(resp, "Content-Type", "text/html")
}
func HttpConnTimeoutTest(s *NoTopoSuite) {
vpp := s.GetContainerByName("vpp").VppInstance
serverAddress := s.VppAddr()
s.Log(vpp.Vppctl("http static server uri tcp://" + serverAddress + "/80 url-handlers debug keepalive-timeout 2"))
req := "GET /version.json HTTP/1.1\r\nHost:" + serverAddress + ":80\r\nUser-Agent:test\r\n\r\n"
conn, err := net.DialTimeout("tcp", serverAddress+":80", time.Second*30)
s.AssertNil(err, fmt.Sprint(err))
defer conn.Close()
err = conn.SetDeadline(time.Now().Add(time.Second * 30))
s.AssertNil(err, fmt.Sprint(err))
_, err = conn.Write([]byte(req))
s.AssertNil(err, fmt.Sprint(err))
reply := make([]byte, 1024)
_, err = conn.Read(reply)
s.AssertNil(err, fmt.Sprint(err))
s.AssertContains(string(reply), "HTTP/1.1 200 OK")
s.Log(vpp.Vppctl("show session verbose 2"))
s.Log("waiting for close on the server side")
time.Sleep(time.Second * 5)
s.Log(vpp.Vppctl("show session verbose 2"))
_, err = conn.Write([]byte(req))
s.AssertNil(err, fmt.Sprint(err))
reply = make([]byte, 1024)
_, err = conn.Read(reply)
s.AssertMatchError(err, io.EOF, "connection not closed by server")
}

View File

@ -1,6 +1,7 @@
package hst
import (
"crypto/tls"
"errors"
"fmt"
"io"
@ -90,6 +91,7 @@ func NewHttpClient(timeout time.Duration) *http.Client {
transport := http.DefaultTransport
transport.(*http.Transport).Proxy = nil
transport.(*http.Transport).DisableKeepAlives = true
transport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
client := &http.Client{
Transport: transport,
Timeout: timeout,