@@ -34,12 +34,14 @@ type ValidatorSettings struct {
3434 RejectInvalidMessage bool
3535 AllowUnknownMessageFields bool
3636 CheckUserDefinedFields bool
37+ CheckFieldsHaveValues bool
3738}
3839
3940// Default configuration for message validation.
4041// See http://www.quickfixengine.org/quickfix/doc/html/configuration.html.
4142var defaultValidatorSettings = ValidatorSettings {
4243 CheckFieldsOutOfOrder : true ,
44+ CheckFieldsHaveValues : true ,
4345 RejectInvalidMessage : true ,
4446 AllowUnknownMessageFields : false ,
4547 CheckUserDefinedFields : true ,
@@ -102,21 +104,21 @@ func (v *fixtValidator) Validate(msg *Message) MessageRejectError {
102104}
103105
104106func validateFIX (d * datadictionary.DataDictionary , settings ValidatorSettings , msgType string , msg * Message ) MessageRejectError {
105- if err := validateMsgType (d , msgType , msg ); err != nil {
106- return err
107- }
108-
109- if err := validateRequired (d , d , msgType , msg ); err != nil {
110- return err
111- }
107+ if d != nil {
108+ if err := validateMsgType (d , msgType , msg ); err != nil {
109+ return err
110+ }
112111
113- if settings .CheckFieldsOutOfOrder {
114- if err := validateOrder (msg ); err != nil {
112+ if err := validateRequired (d , d , msgType , msg ); err != nil {
115113 return err
116114 }
117115 }
118116
119- if settings .RejectInvalidMessage {
117+ if err := validateFieldContent (msg , settings .CheckFieldsHaveValues , settings .CheckFieldsOutOfOrder ); err != nil {
118+ return err
119+ }
120+
121+ if settings .RejectInvalidMessage && d != nil {
120122 if err := validateFields (d , d , settings , msgType , msg ); err != nil {
121123 return err
122124 }
@@ -130,21 +132,21 @@ func validateFIX(d *datadictionary.DataDictionary, settings ValidatorSettings, m
130132}
131133
132134func validateFIXT (transportDD , appDD * datadictionary.DataDictionary , settings ValidatorSettings , msgType string , msg * Message ) MessageRejectError {
133- if err := validateMsgType (appDD , msgType , msg ); err != nil {
134- return err
135- }
136-
137- if err := validateRequired (transportDD , appDD , msgType , msg ); err != nil {
138- return err
139- }
135+ if appDD != nil && transportDD != nil {
136+ if err := validateMsgType (appDD , msgType , msg ); err != nil {
137+ return err
138+ }
140139
141- if settings .CheckFieldsOutOfOrder {
142- if err := validateOrder (msg ); err != nil {
140+ if err := validateRequired (transportDD , appDD , msgType , msg ); err != nil {
143141 return err
144142 }
145143 }
146144
147- if settings .RejectInvalidMessage {
145+ if err := validateFieldContent (msg , settings .CheckFieldsHaveValues , settings .CheckFieldsOutOfOrder ); err != nil {
146+ return err
147+ }
148+
149+ if settings .RejectInvalidMessage && appDD != nil && transportDD != nil {
148150 if err := validateFields (transportDD , appDD , settings , msgType , msg ); err != nil {
149151 return err
150152 }
@@ -270,20 +272,26 @@ func validateVisitGroupField(fieldDef *datadictionary.FieldDef, fieldStack []Tag
270272 return fieldStack , nil
271273}
272274
273- func validateOrder (msg * Message ) MessageRejectError {
275+ func validateFieldContent (msg * Message , checkFieldsHaveValues , checkFieldsOutOfOrder bool ) MessageRejectError {
276+ if ! checkFieldsHaveValues && ! checkFieldsOutOfOrder {
277+ return nil
278+ }
274279 inHeader := true
275280 inTrailer := false
276281 for _ , field := range msg .fields {
277282 t := field .tag
283+ if checkFieldsHaveValues && len (field .value ) == 0 {
284+ return TagSpecifiedWithoutAValue (t )
285+ }
278286 switch {
279287 case inHeader && t .IsHeader ():
280288 case inHeader && ! t .IsHeader ():
281289 inHeader = false
282- case ! inHeader && t .IsHeader ():
290+ case ! inHeader && t .IsHeader () && checkFieldsOutOfOrder :
283291 return tagSpecifiedOutOfRequiredOrder (t )
284292 case t .IsTrailer ():
285293 inTrailer = true
286- case inTrailer && ! t .IsTrailer ():
294+ case inTrailer && ! t .IsTrailer () && checkFieldsOutOfOrder :
287295 return tagSpecifiedOutOfRequiredOrder (t )
288296 }
289297 }
0 commit comments