@@ -874,6 +874,67 @@ func TestConnectConfigRequiresConfigFromParseConfig(t *testing.T) {
874874 require .PanicsWithValue (t , "config must be created by ParseConfig" , func () { pgconn .ConnectConfig (ctx , config ) })
875875}
876876
877+ func TestConnectConfigMaxProtocolMessageBodyLen (t * testing.T ) {
878+ t .Parallel ()
879+
880+ ln , err := net .Listen ("tcp" , "127.0.0.1:" )
881+ require .NoError (t , err )
882+ defer ln .Close ()
883+
884+ serverErrChan := make (chan error , 1 )
885+ go func () {
886+ defer close (serverErrChan )
887+
888+ conn , err := ln .Accept ()
889+ if err != nil {
890+ serverErrChan <- err
891+ return
892+ }
893+ defer conn .Close ()
894+
895+ err = conn .SetDeadline (time .Now ().Add (5 * time .Second ))
896+ if err != nil {
897+ serverErrChan <- err
898+ return
899+ }
900+
901+ backend := pgproto3 .NewBackend (conn , conn )
902+ _ , err = backend .ReceiveStartupMessage ()
903+ if err != nil {
904+ serverErrChan <- err
905+ return
906+ }
907+
908+ // ParameterStatus declares a 6-octet body, which verifies that Config.MaxProtocolMessageBodyLen
909+ // is installed before startup responses are received.
910+ _ , err = conn .Write ([]byte {'S' , 0 , 0 , 0 , 10 })
911+ if err != nil {
912+ serverErrChan <- err
913+ return
914+ }
915+ }()
916+
917+ host , port , _ := strings .Cut (ln .Addr ().String (), ":" )
918+ connStr := fmt .Sprintf ("sslmode=disable host=%s port=%s" , host , port )
919+
920+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
921+ defer cancel ()
922+
923+ config , err := pgconn .ParseConfig (connStr )
924+ require .NoError (t , err )
925+ config .MaxProtocolMessageBodyLen = 5
926+
927+ conn , err := pgconn .ConnectConfig (ctx , config )
928+ require .Nil (t , conn )
929+
930+ var bodyLenErr * pgproto3.ExceededMaxBodyLenErr
931+ require .ErrorAs (t , err , & bodyLenErr )
932+ assert .Equal (t , 5 , bodyLenErr .MaxExpectedBodyLen )
933+ assert .Equal (t , 6 , bodyLenErr .ActualBodyLen )
934+
935+ require .NoError (t , <- serverErrChan )
936+ }
937+
877938func TestConnPrepareSyntaxError (t * testing.T ) {
878939 t .Parallel ()
879940
0 commit comments