From d42b80d46033d2c4a3f18720d107a0bc96af3d65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:57:50 +0000 Subject: [PATCH 01/14] Bump golang.org/x/crypto from 0.15.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.15.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2b50e4c02..79325ae45 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - golang.org/x/crypto v0.15.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/go.sum b/go.sum index d178baaab..759546724 100644 --- a/go.sum +++ b/go.sum @@ -55,8 +55,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= From cbc2320eec86ea7089c3748b70d6b8130880af16 Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Tue, 23 Apr 2024 15:33:40 -0500 Subject: [PATCH 02/14] Update deps --- go.mod | 11 +++++------ go.sum | 31 ++++++++++--------------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 79325ae45..8b36cf024 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,13 @@ module github.com/quickfixgo/quickfix go 1.21 require ( - github.com/armon/go-proxyproto v0.1.0 - github.com/mattn/go-sqlite3 v1.14.18 + github.com/mattn/go-sqlite3 v1.14.22 github.com/pires/go-proxyproto v0.7.0 github.com/pkg/errors v0.9.1 - github.com/shopspring/decimal v1.3.1 + github.com/shopspring/decimal v1.4.0 github.com/stretchr/testify v1.8.4 - go.mongodb.org/mongo-driver v1.13.0 - golang.org/x/net v0.18.0 + go.mongodb.org/mongo-driver v1.15.0 + golang.org/x/net v0.24.0 ) require ( @@ -25,7 +24,7 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - golang.org/x/crypto v0.17.0 // indirect + golang.org/x/crypto v0.22.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/go.sum b/go.sum index 759546724..a7e47992c 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,11 @@ -github.com/armon/go-proxyproto v0.1.0 h1:TWWcSsjco7o2itn6r25/5AqKBiWmsiuzsUDLT/MTl7k= -github.com/armon/go-proxyproto v0.1.0/go.mod h1:Xj90dce2VKbHzRAeiVQAMBtj4M5oidoXJ8lmgyW21mw= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= @@ -18,9 +14,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= -github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= @@ -29,8 +24,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= @@ -45,26 +40,23 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= -go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= @@ -72,7 +64,6 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -80,10 +71,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 49e71b8fdb4f9cf0fbd5fc33071b69ca5d6c3d6a Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Tue, 23 Apr 2024 15:48:53 -0500 Subject: [PATCH 03/14] v0.9.2 release notes --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a17b6aff..157000a68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,12 @@ +## 0.9.2 (April 23, 2024) + +### BUG FIXES +* Prevent message queue blocking in the case of network connection trouble https://github.com/quickfixgo/quickfix/pull/615 https://github.com/quickfixgo/quickfix/pull/628 +* Corrects validation of multiple repeating groups with different fields https://github.com/quickfixgo/quickfix/pull/623 + ## 0.9.1 (April 15, 2024) + +### BUG FIXES * Preserve original body when resending https://github.com/quickfixgo/quickfix/pull/624 ## 0.9.0 (November 13, 2023) From 0c6264c40dac72c823939cafbd34fe15a3353fa2 Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Tue, 23 Apr 2024 15:48:53 -0500 Subject: [PATCH 04/14] v0.9.2 release notes --- fix_decimal_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fix_decimal_test.go b/fix_decimal_test.go index f6fc3d53c..7c8d3a265 100644 --- a/fix_decimal_test.go +++ b/fix_decimal_test.go @@ -60,7 +60,7 @@ func TestFIXDecimalRead(t *testing.T) { require.Equal(t, test.expectError, err != nil) if !test.expectError { - assert.True(t, test.expected.Equals(field.Decimal), "Expected %s got %s", test.expected, field.Decimal) + assert.True(t, test.expected.Equal(field.Decimal), "Expected %s got %s", test.expected, field.Decimal) } } } From 02e9081befd45684fb4c4cfbf80e65d4d6c995a0 Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Thu, 25 Apr 2024 17:09:02 -0500 Subject: [PATCH 05/14] Corrects ResetOnLogon for initiators --- Makefile | 24 +++++++++++++++--------- session.go | 3 +-- session_state.go | 8 ++++++++ session_test.go | 10 +++++++--- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index b05c5d72f..b68843f3c 100644 --- a/Makefile +++ b/Makefile @@ -28,24 +28,30 @@ lint: linters-install # --------------------------------------------------------------- # Targets related to running acceptance tests - +ifdef STORE_TYPE +STORE := $(STORE_TYPE) +else +STORE := memory +endif + build-test-srv: - cd _test; go build -o echo_server ./test-server/ + cd _test; go build -v -o echo_server ./test-server/ fix40: - cd _test; ./runat.sh $@.cfg 5001 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5001 $(STORE) "definitions/server/$@/*.def" fix41: - cd _test; ./runat.sh $@.cfg 5002 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5002 $(STORE) "definitions/server/$@/*.def" fix42: - cd _test; ./runat.sh $@.cfg 5003 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5003 $(STORE) "definitions/server/$@/*.def" fix43: - cd _test; ./runat.sh $@.cfg 5004 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5004 $(STORE) "definitions/server/$@/*.def" fix44: - cd _test; ./runat.sh $@.cfg 5005 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5005 $(STORE) "definitions/server/$@/*.def" fix50: - cd _test; ./runat.sh $@.cfg 5006 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5006 $(STORE) "definitions/server/$@/*.def" fix50sp1: - cd _test; ./runat.sh $@.cfg 5007 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5007 $(STORE) "definitions/server/$@/*.def" fix50sp2: - cd _test; ./runat.sh $@.cfg 5008 $(STORE_TYPE) "definitions/server/$@/*.def" + cd _test; ./runat.sh $@.cfg 5008 $(STORE) "definitions/server/$@/*.def" ACCEPT_SUITE=fix40 fix41 fix42 fix43 fix44 fix50 fix50sp1 fix50sp2 accept: $(ACCEPT_SUITE) diff --git a/session.go b/session.go index 1bf60b122..5ab8c5edc 100644 --- a/session.go +++ b/session.go @@ -310,8 +310,6 @@ func (s *session) prepMessageForSend(msg *Message, inReplyTo *Message) (msgBytes } if isAdminMessageType(msgType) { - s.application.ToAdmin(msg, s.sessionID) - if bytes.Equal(msgType, msgTypeLogon) { var resetSeqNumFlag FIXBoolean if msg.Body.Has(tagResetSeqNumFlag) { @@ -330,6 +328,7 @@ func (s *session) prepMessageForSend(msg *Message, inReplyTo *Message) (msgBytes msg.Header.SetField(tagMsgSeqNum, FIXInt(seqNum)) } } + s.application.ToAdmin(msg, s.sessionID) } else { if err = s.application.ToApp(msg, s.sessionID); err != nil { return diff --git a/session_state.go b/session_state.go index 527556209..2c8b84d3c 100644 --- a/session_state.go +++ b/session_state.go @@ -49,6 +49,14 @@ func (sm *stateMachine) Connect(session *session) { return } } + + if session.ResetOnLogon { + if err := session.store.Reset(); err != nil { + session.logError(err) + return + } + } + session.log.OnEvent("Sending logon request") if err := session.sendLogon(); err != nil { session.logError(err) diff --git a/session_test.go b/session_test.go index b9a70c9b5..9308ec4f0 100644 --- a/session_test.go +++ b/session_test.go @@ -673,14 +673,18 @@ func (s *SessionSuite) TestInitiateLogonResetSeqNumFlag() { } s.session.State = latentState{} s.session.HeartBtInt = time.Duration(45) * time.Second + s.Require().Nil(s.store.Reset()) + s.NextSenderMsgSeqNum(1) + s.NextTargetMsgSeqNum(1) s.IncrNextTargetMsgSeqNum() s.IncrNextSenderMsgSeqNum() + s.session.ResetOnLogon = true s.session.InitiateLogon = true + s.NextSenderMsgSeqNum(2) + s.NextTargetMsgSeqNum(2) + s.MockApp.On("ToAdmin") - s.MockApp.decorateToAdmin = func(msg *Message) { - msg.Body.SetField(tagResetSeqNumFlag, FIXBoolean(true)) - } s.session.onAdmin(adminMsg) s.MockApp.AssertExpectations(s.T()) From daf7cc040bb26436851f9ebf9f86a2905aec7eb0 Mon Sep 17 00:00:00 2001 From: yanghao Date: Thu, 25 Apr 2024 05:03:37 -0400 Subject: [PATCH 06/14] feat: AllowUnknownMessageFields & CheckUserDefinedFields --- config/configuration.go | 2 + session_factory.go | 12 +++ validation.go | 80 ++++++++++++++----- validation_test.go | 170 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 244 insertions(+), 20 deletions(-) diff --git a/config/configuration.go b/config/configuration.go index 2c73ac369..b5fa7c28a 100644 --- a/config/configuration.go +++ b/config/configuration.go @@ -66,6 +66,8 @@ const ( MaxLatency string = "MaxLatency" PersistMessages string = "PersistMessages" RejectInvalidMessage string = "RejectInvalidMessage" + AllowUnknownMessageFields string = "AllowUnknownMessageFields" + CheckUserDefinedFields string = "CheckUserDefinedFields" DynamicSessions string = "DynamicSessions" DynamicQualifier string = "DynamicQualifier" ) diff --git a/session_factory.go b/session_factory.go index f28e552bd..37818deb9 100644 --- a/session_factory.go +++ b/session_factory.go @@ -99,6 +99,18 @@ func (f sessionFactory) newSession( } } + if settings.HasSetting(config.AllowUnknownMessageFields) { + if validatorSettings.AllowUnknownMessageFields, err = settings.BoolSetting(config.AllowUnknownMessageFields); err != nil { + return + } + } + + if settings.HasSetting(config.CheckUserDefinedFields) { + if validatorSettings.CheckUserDefinedFields, err = settings.BoolSetting(config.CheckUserDefinedFields); err != nil { + return + } + } + if sessionID.IsFIXT() { if s.DefaultApplVerID, err = settings.Setting(config.DefaultApplVerID); err != nil { return diff --git a/validation.go b/validation.go index 23564ca3d..e9b718138 100644 --- a/validation.go +++ b/validation.go @@ -19,6 +19,10 @@ import ( "github.com/quickfixgo/quickfix/datadictionary" ) +const ( + UserDefinedTagMin int = 5000 +) + // Validator validates a FIX message. type Validator interface { Validate(*Message) MessageRejectError @@ -26,15 +30,19 @@ type Validator interface { // ValidatorSettings describe validation behavior. type ValidatorSettings struct { - CheckFieldsOutOfOrder bool - RejectInvalidMessage bool + CheckFieldsOutOfOrder bool + RejectInvalidMessage bool + AllowUnknownMessageFields bool + CheckUserDefinedFields bool } // Default configuration for message validation. // See http://www.quickfixengine.org/quickfix/doc/html/configuration.html. var defaultValidatorSettings = ValidatorSettings{ - CheckFieldsOutOfOrder: true, - RejectInvalidMessage: true, + CheckFieldsOutOfOrder: true, + RejectInvalidMessage: true, + AllowUnknownMessageFields: false, + CheckUserDefinedFields: true, } type fixValidator struct { @@ -109,11 +117,11 @@ func validateFIX(d *datadictionary.DataDictionary, settings ValidatorSettings, m } if settings.RejectInvalidMessage { - if err := validateFields(d, d, msgType, msg); err != nil { + if err := validateFields(d, d, settings, msgType, msg); err != nil { return err } - if err := validateWalk(d, d, msgType, msg); err != nil { + if err := validateWalk(d, d, settings, msgType, msg); err != nil { return err } } @@ -137,11 +145,11 @@ func validateFIXT(transportDD, appDD *datadictionary.DataDictionary, settings Va } if settings.RejectInvalidMessage { - if err := validateFields(transportDD, appDD, msgType, msg); err != nil { + if err := validateFields(transportDD, appDD, settings, msgType, msg); err != nil { return err } - if err := validateWalk(transportDD, appDD, msgType, msg); err != nil { + if err := validateWalk(transportDD, appDD, settings, msgType, msg); err != nil { return err } } @@ -156,7 +164,7 @@ func validateMsgType(d *datadictionary.DataDictionary, msgType string, _ *Messag return nil } -func validateWalk(transportDD *datadictionary.DataDictionary, appDD *datadictionary.DataDictionary, msgType string, msg *Message) MessageRejectError { +func validateWalk(transportDD *datadictionary.DataDictionary, appDD *datadictionary.DataDictionary, settings ValidatorSettings, msgType string, msg *Message) MessageRejectError { remainingFields := msg.fields iteratedTags := make(datadictionary.TagSet) @@ -178,15 +186,19 @@ func validateWalk(transportDD *datadictionary.DataDictionary, appDD *datadiction messageDef = appDD.Messages[msgType] } - if fieldDef, ok = messageDef.Fields[int(tag)]; !ok { - return TagNotDefinedForThisMessageType(tag) - } - if _, duplicate := iteratedTags[int(tag)]; duplicate { return tagAppearsMoreThanOnce(tag) } iteratedTags.Add(int(tag)) + if fieldDef, ok = messageDef.Fields[int(tag)]; !ok { + if !checkFieldNotDefined(settings, tag) { + return TagNotDefinedForThisMessageType(tag) + } + remainingFields = remainingFields[1:] + continue + } + if remainingFields, err = validateVisitField(fieldDef, remainingFields); err != nil { return err } @@ -306,19 +318,24 @@ func validateRequiredFieldMap(_ *Message, requiredTags map[int]struct{}, fieldMa return nil } -func validateFields(transportDD *datadictionary.DataDictionary, appDD *datadictionary.DataDictionary, msgType string, message *Message) MessageRejectError { +func validateFields(transportDD *datadictionary.DataDictionary, + appDD *datadictionary.DataDictionary, + settings ValidatorSettings, + msgType string, + message *Message, +) MessageRejectError { for _, field := range message.fields { switch { case field.tag.IsHeader(): - if err := validateField(transportDD, transportDD.Header.Tags, field); err != nil { + if err := validateField(transportDD, settings, transportDD.Header.Tags, field); err != nil { return err } case field.tag.IsTrailer(): - if err := validateField(transportDD, transportDD.Trailer.Tags, field); err != nil { + if err := validateField(transportDD, settings, transportDD.Trailer.Tags, field); err != nil { return err } default: - if err := validateField(appDD, appDD.Messages[msgType].Tags, field); err != nil { + if err := validateField(appDD, settings, appDD.Messages[msgType].Tags, field); err != nil { return err } } @@ -327,15 +344,39 @@ func validateFields(transportDD *datadictionary.DataDictionary, appDD *datadicti return nil } -func validateField(d *datadictionary.DataDictionary, _ datadictionary.TagSet, field TagValue) MessageRejectError { +func getFieldType(d *datadictionary.DataDictionary, field int) (*datadictionary.FieldType, bool) { + fieldType, isMessageField := d.FieldTypeByTag[field] + return fieldType, isMessageField +} + +func checkFieldNotDefined(settings ValidatorSettings, field Tag) bool { + fail := false + if int(field) < UserDefinedTagMin { + fail = !settings.AllowUnknownMessageFields + } else { + fail = settings.CheckUserDefinedFields + } + return !fail +} + +func validateField(d *datadictionary.DataDictionary, + settings ValidatorSettings, + _ datadictionary.TagSet, + field TagValue, +) MessageRejectError { if len(field.value) == 0 { return TagSpecifiedWithoutAValue(field.tag) } - if _, valid := d.FieldTypeByTag[int(field.tag)]; !valid { + fieldType, isMessageField := getFieldType(d, int(field.tag)) + if !isMessageField && !checkFieldNotDefined(settings, field.tag) { return InvalidTagNumber(field.tag) } + if !isMessageField { + return nil + } + allowedValues := d.FieldTypeByTag[int(field.tag)].Enums if len(allowedValues) != 0 { if _, validValue := allowedValues[string(field.value)]; !validValue { @@ -343,7 +384,6 @@ func validateField(d *datadictionary.DataDictionary, _ datadictionary.TagSet, fi } } - fieldType := d.FieldTypeByTag[int(field.tag)] var prototype FieldValue switch fieldType.Type { case "MULTIPLESTRINGVALUE", "MULTIPLEVALUESTRING": diff --git a/validation_test.go b/validation_test.go index 861dd863e..1647dc94e 100644 --- a/validation_test.go +++ b/validation_test.go @@ -74,6 +74,14 @@ func TestValidate(t *testing.T) { tcInvalidTagCheckDisabledFixT(), tcInvalidTagCheckEnabled(), tcInvalidTagCheckEnabledFixT(), + tcAllowUnknownMessageFieldsEnabled(), + tcAllowUnknownMessageFieldsEnabledFixT(), + tcAllowUnknownMessageFieldsDisabled(), + tcAllowUnknownMessageFieldsDisabledFixT(), + tcCheckUserDefinedFieldsEnabled(), + tcCheckUserDefinedFieldsEnabledFixT(), + tcCheckUserDefinedFieldsDisabled(), + tcCheckUserDefinedFieldsDisabledFixT(), tcMultipleRepeatingGroupFields(), } @@ -786,6 +794,168 @@ func tcInvalidTagCheckEnabledFixT() validateTest { } } +func tcAllowUnknownMessageFieldsEnabled() validateTest { + dict, _ := datadictionary.Parse("spec/FIX40.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.AllowUnknownMessageFields = true + validator := NewValidator(customValidatorSettings, dict, nil) + + builder := createFIX40NewOrderSingle() + tag := Tag(41) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Allow Unknown Message Fields - Enabled", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: true, + } +} + +func tcAllowUnknownMessageFieldsEnabledFixT() validateTest { + tDict, _ := datadictionary.Parse("spec/FIXT11.xml") + appDict, _ := datadictionary.Parse("spec/FIX50SP2.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.AllowUnknownMessageFields = true + validator := NewValidator(customValidatorSettings, appDict, tDict) + + builder := createFIX50SP2NewOrderSingle() + tag := Tag(41) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Allow Unknown Message Fields - Enabled FIXT", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: true, + } +} + +func tcAllowUnknownMessageFieldsDisabled() validateTest { + dict, _ := datadictionary.Parse("spec/FIX40.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.AllowUnknownMessageFields = false + validator := NewValidator(customValidatorSettings, dict, nil) + + builder := createFIX40NewOrderSingle() + tag := Tag(41) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Allow Unknown Message Fields - Disabled", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: false, + ExpectedRejectReason: rejectReasonTagNotDefinedForThisMessageType, + ExpectedRefTagID: &tag, + } +} + +func tcAllowUnknownMessageFieldsDisabledFixT() validateTest { + tDict, _ := datadictionary.Parse("spec/FIXT11.xml") + appDict, _ := datadictionary.Parse("spec/FIX50SP2.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.RejectInvalidMessage = true + validator := NewValidator(customValidatorSettings, appDict, tDict) + + builder := createFIX50SP2NewOrderSingle() + tag := Tag(41) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Allow Unknown Message Fields - Disabled FIXT", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: false, + ExpectedRejectReason: rejectReasonTagNotDefinedForThisMessageType, + ExpectedRefTagID: &tag, + } +} + +func tcCheckUserDefinedFieldsEnabled() validateTest { + dict, _ := datadictionary.Parse("spec/FIX40.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.CheckUserDefinedFields = true + validator := NewValidator(customValidatorSettings, dict, nil) + + builder := createFIX40NewOrderSingle() + tag := Tag(9999) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Check User Defined Fields - Enabled", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: false, + ExpectedRefTagID: &tag, + } +} + +func tcCheckUserDefinedFieldsEnabledFixT() validateTest { + tDict, _ := datadictionary.Parse("spec/FIXT11.xml") + appDict, _ := datadictionary.Parse("spec/FIX50SP2.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.RejectInvalidMessage = true + validator := NewValidator(customValidatorSettings, appDict, tDict) + + builder := createFIX50SP2NewOrderSingle() + tag := Tag(9999) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Check User Defined Fields - Enabled FIXT", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: false, + ExpectedRefTagID: &tag, + } +} + +func tcCheckUserDefinedFieldsDisabled() validateTest { + dict, _ := datadictionary.Parse("spec/FIX40.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.CheckUserDefinedFields = false + validator := NewValidator(customValidatorSettings, dict, nil) + + builder := createFIX40NewOrderSingle() + tag := Tag(9999) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Check User Defined Fields - Disabled", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: true, + } +} + +func tcCheckUserDefinedFieldsDisabledFixT() validateTest { + tDict, _ := datadictionary.Parse("spec/FIXT11.xml") + appDict, _ := datadictionary.Parse("spec/FIX50SP2.xml") + customValidatorSettings := defaultValidatorSettings + customValidatorSettings.CheckUserDefinedFields = false + validator := NewValidator(customValidatorSettings, appDict, tDict) + + builder := createFIX50SP2NewOrderSingle() + tag := Tag(9999) + builder.Body.SetField(tag, FIXString("hello")) + msgBytes := builder.build() + + return validateTest{ + TestName: "Check User Defined Fields - Disabled FIXT", + Validator: validator, + MessageBytes: msgBytes, + DoNotExpectReject: true, + } +} + func tcTagSpecifiedOutOfRequiredOrderDisabledHeader() validateTest { dict, _ := datadictionary.Parse("spec/FIX40.xml") customValidatorSettings := defaultValidatorSettings From 2f8aab222a4dac25a5acb37cea8c40c3224ecb46 Mon Sep 17 00:00:00 2001 From: yanghao Date: Thu, 25 Apr 2024 05:11:31 -0400 Subject: [PATCH 07/14] change options to keep same with quickfixj --- config/configuration.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/configuration.go b/config/configuration.go index b5fa7c28a..bf3044dba 100644 --- a/config/configuration.go +++ b/config/configuration.go @@ -66,8 +66,8 @@ const ( MaxLatency string = "MaxLatency" PersistMessages string = "PersistMessages" RejectInvalidMessage string = "RejectInvalidMessage" - AllowUnknownMessageFields string = "AllowUnknownMessageFields" - CheckUserDefinedFields string = "CheckUserDefinedFields" + AllowUnknownMessageFields string = "AllowUnknownMsgFields" + CheckUserDefinedFields string = "ValidateUserDefinedFields" DynamicSessions string = "DynamicSessions" DynamicQualifier string = "DynamicQualifier" ) From e53eadcaa0d5082bb15847929ae00200ae9b7c39 Mon Sep 17 00:00:00 2001 From: SNORRIS721 Date: Fri, 3 May 2024 10:36:01 -0500 Subject: [PATCH 08/14] Unregistering sessions on initiator close --- initiator.go | 8 ++++++++ session_factory_test.go | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/initiator.go b/initiator.go index 1b48ce4ce..b8735e388 100644 --- a/initiator.go +++ b/initiator.go @@ -73,6 +73,14 @@ func (i *Initiator) Stop() { default: } close(i.stopChan) + + for sessionID := range i.sessionSettings { + err := UnregisterSession(sessionID) + if err != nil { + return + } + } + i.wg.Wait() } diff --git a/session_factory_test.go b/session_factory_test.go index d14c5b221..349e7580c 100644 --- a/session_factory_test.go +++ b/session_factory_test.go @@ -472,6 +472,23 @@ func (s *SessionFactorySuite) TestNewSessionBuildInitiators() { s.Equal("127.0.0.1:5000", session.SocketConnectAddress[0]) } +func (s *SessionFactorySuite) TestDuplicateSession() { + s.sessionFactory.BuildInitiators = true + s.SessionSettings.Set(config.HeartBtInt, "34") + s.SessionSettings.Set(config.SocketConnectHost, "127.0.0.1") + s.SessionSettings.Set(config.SocketConnectPort, "5000") + + session, err := s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) + s.Nil(err) + s.True(session.InitiateLogon) + _, err = s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) + s.NotNil(err) + s.Equal("Duplicate SessionID", err.Error()) + UnregisterSession(s.SessionID) + _, err = s.createSession(s.SessionID, s.MessageStoreFactory, s.SessionSettings, s.LogFactory, s.App) + s.Nil(err) +} + func (s *SessionFactorySuite) TestNewSessionBuildAcceptors() { s.sessionFactory.BuildInitiators = false s.SessionSettings.Set(config.HeartBtInt, "34") From 4c64a4fec3a580c3d23070bee21fe9a64c8d4425 Mon Sep 17 00:00:00 2001 From: SNORRIS721 Date: Fri, 3 May 2024 13:50:51 -0500 Subject: [PATCH 09/14] Unregistering sessions on acceptor stop --- acceptor.go | 7 +++++++ initiator.go | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/acceptor.go b/acceptor.go index 968be9efb..da4cd9bb0 100644 --- a/acceptor.go +++ b/acceptor.go @@ -144,6 +144,13 @@ func (a *Acceptor) Stop() { session.stop() } a.sessionGroup.Wait() + + for sessionID := range a.sessions { + err := UnregisterSession(sessionID) + if err != nil { + return + } + } } // RemoteAddr gets remote IP address for a given session. diff --git a/initiator.go b/initiator.go index b8735e388..eeff30fc0 100644 --- a/initiator.go +++ b/initiator.go @@ -74,14 +74,14 @@ func (i *Initiator) Stop() { } close(i.stopChan) + i.wg.Wait() + for sessionID := range i.sessionSettings { err := UnregisterSession(sessionID) if err != nil { return } } - - i.wg.Wait() } // NewInitiator creates and initializes a new Initiator. From ed1f5d7f0075518ac001356e76d575a8ce9ff7ed Mon Sep 17 00:00:00 2001 From: SNORRIS721 Date: Wed, 8 May 2024 12:36:14 -0500 Subject: [PATCH 10/14] Changing filestore.offsets from map[int]msgDef to sync.Map --- store/file/filestore.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/store/file/filestore.go b/store/file/filestore.go index 4a3dadb5d..43c647a97 100644 --- a/store/file/filestore.go +++ b/store/file/filestore.go @@ -22,6 +22,7 @@ import ( "path" "strconv" "strings" + "sync" "time" "github.com/pkg/errors" @@ -42,7 +43,7 @@ type fileStoreFactory struct { type fileStore struct { sessionID quickfix.SessionID cache quickfix.MessageStore - offsets map[int]msgDef + offsets sync.Map bodyFname string headerFname string sessionFname string @@ -106,7 +107,7 @@ func newFileStore(sessionID quickfix.SessionID, dirname string, fileSync bool) ( store := &fileStore{ sessionID: sessionID, cache: memStore, - offsets: make(map[int]msgDef), + offsets: sync.Map{}, bodyFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "body")), headerFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "header")), sessionFname: path.Join(dirname, fmt.Sprintf("%s.%s", sessionPrefix, "session")), @@ -206,7 +207,7 @@ func (store *fileStore) populateCache() (creationTimePopulated bool, err error) if cnt, err := fmt.Fscanf(tmpHeaderFile, "%d,%d,%d\n", &seqNum, &offset, &size); err != nil || cnt != 3 { break } - store.offsets[seqNum] = msgDef{offset: offset, size: size} + store.offsets.Store(seqNum, msgDef{offset: offset, size: size}) } } @@ -347,7 +348,7 @@ func (store *fileStore) SaveMessage(seqNum int, msg []byte) error { } } - store.offsets[seqNum] = msgDef{offset: offset, size: len(msg)} + store.offsets.Store(seqNum, msgDef{offset: offset, size: len(msg)}) return nil } @@ -360,7 +361,7 @@ func (store *fileStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg [] } func (store *fileStore) getMessage(seqNum int) (msg []byte, found bool, err error) { - msgInfo, found := store.offsets[seqNum] + msgInfo, found := store.offsets.Load(seqNum) if !found { return } From f8534bea585922ea1ce2a528b7aa47793a0fd969 Mon Sep 17 00:00:00 2001 From: SNORRIS721 Date: Wed, 8 May 2024 13:04:25 -0500 Subject: [PATCH 11/14] fixing msgdef type error --- store/file/filestore.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/store/file/filestore.go b/store/file/filestore.go index 43c647a97..1c6e26889 100644 --- a/store/file/filestore.go +++ b/store/file/filestore.go @@ -361,10 +361,11 @@ func (store *fileStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg [] } func (store *fileStore) getMessage(seqNum int) (msg []byte, found bool, err error) { - msgInfo, found := store.offsets.Load(seqNum) + msgInfoTemp, found := store.offsets.Load(seqNum) if !found { return } + msgInfo := msgInfoTemp.(msgDef) msg = make([]byte, msgInfo.size) if _, err = store.bodyFile.ReadAt(msg, msgInfo.offset); err != nil { From d7827d336642e1447c1abe38d370f71a6dd1df71 Mon Sep 17 00:00:00 2001 From: SNORRIS721 Date: Wed, 8 May 2024 15:51:32 -0500 Subject: [PATCH 12/14] adding error handling to type cast --- store/file/filestore.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/store/file/filestore.go b/store/file/filestore.go index 1c6e26889..0cc1e3c33 100644 --- a/store/file/filestore.go +++ b/store/file/filestore.go @@ -365,7 +365,10 @@ func (store *fileStore) getMessage(seqNum int) (msg []byte, found bool, err erro if !found { return } - msgInfo := msgInfoTemp.(msgDef) + msgInfo, ok := msgInfoTemp.(msgDef) + if !ok { + return nil, true, fmt.Errorf("incorrect msgInfo type while reading file: %s", store.bodyFname) + } msg = make([]byte, msgInfo.size) if _, err = store.bodyFile.ReadAt(msg, msgInfo.offset); err != nil { From fd466b72d46f3cf4611e0aad80b18d84fe51af25 Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Thu, 9 May 2024 13:52:37 -0500 Subject: [PATCH 13/14] v0.9.3 release notes --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 157000a68..512df8d89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.9.3 (May 9, 2024) + +### BUG FIXES +* Change filestore.offsets from map[int]msgDef to sync.Map https://github.com/quickfixgo/quickfix/pull/639 +* Unregister sessions on stop https://github.com/quickfixgo/quickfix/pull/637 +* Corrects ResetOnLogon behavior for initiators https://github.com/quickfixgo/quickfix/pull/635 + +### FEATURES +* Add AllowUnknownMessageFields & CheckUserDefinedFields settings as included in QuickFIX/J https://github.com/quickfixgo/quickfix/pull/632 + ## 0.9.2 (April 23, 2024) ### BUG FIXES From b8c5ddc7de73358c05ea1ab4d9433a912fbe3111 Mon Sep 17 00:00:00 2001 From: Michael Ackley Date: Fri, 17 May 2024 10:11:01 -0500 Subject: [PATCH 14/14] Adds log to readLoop just like write loop --- acceptor.go | 2 +- connection.go | 3 ++- initiator.go | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/acceptor.go b/acceptor.go index da4cd9bb0..f5b9b281c 100644 --- a/acceptor.go +++ b/acceptor.go @@ -356,7 +356,7 @@ func (a *Acceptor) handleConnection(netConn net.Conn) { go func() { msgIn <- fixIn{msgBytes, parser.lastRead} - readLoop(parser, msgIn) + readLoop(parser, msgIn, a.globalLog) }() writeLoop(netConn, msgOut, a.globalLog) diff --git a/connection.go b/connection.go index c006560f4..99a4c465e 100644 --- a/connection.go +++ b/connection.go @@ -30,12 +30,13 @@ func writeLoop(connection io.Writer, messageOut chan []byte, log Log) { } } -func readLoop(parser *parser, msgIn chan fixIn) { +func readLoop(parser *parser, msgIn chan fixIn, log Log) { defer close(msgIn) for { msg, err := parser.ReadMessage() if err != nil { + log.OnEvent(err.Error()) return } msgIn <- fixIn{msg, parser.lastRead} diff --git a/initiator.go b/initiator.go index eeff30fc0..8f7a76200 100644 --- a/initiator.go +++ b/initiator.go @@ -198,7 +198,7 @@ func (i *Initiator) handleConnection(session *session, tlsConfig *tls.Config, di goto reconnect } - go readLoop(newParser(bufio.NewReader(netConn)), msgIn) + go readLoop(newParser(bufio.NewReader(netConn)), msgIn, session.log) disconnected = make(chan interface{}) go func() { writeLoop(netConn, msgOut, session.log)