func (s *FrameSuite) TestDetermineVersion_IncompatibleVersions(c *C) { f := frame.New(frame.CONNECT) f.Header.Add(frame.AcceptVersion, "0.2,0.1,1.3,2.0") version, err := determineVersion(f) c.Check(version, Equals, stomp.Version("")) c.Check(err, Equals, unknownVersion) }
// Determine the most acceptable version based on the accept-version // header of a CONNECT or STOMP frame. // // Returns stomp.V10 if a CONNECT frame and the accept-version header is missing. // // Returns an error if the frame is not a CONNECT or STOMP frame, or // if the accept-header is malformed or does not contain any compatible // version numbers. Also returns an error if the accept-header is missing // for a STOMP frame. // // Otherwise, returns the highest compatible version specified in the // accept-version header. Compatible versions are V1_0, V1_1 and V1_2. func determineVersion(f *frame.Frame) (version stomp.Version, err error) { // frame can be CONNECT or STOMP with slightly different // handling of accept-verion for each isConnect := f.Command == frame.CONNECT if !isConnect && f.Command != frame.STOMP { err = notConnectFrame return } // start with an error, and remove if successful err = unknownVersion if acceptVersion, ok := f.Header.Contains(frame.AcceptVersion); ok { // sort the versions so that the latest version comes last versions := strings.Split(acceptVersion, ",") sort.Strings(versions) for _, v := range versions { switch stomp.Version(v) { case stomp.V10: version = stomp.V10 err = nil case stomp.V11: version = stomp.V11 err = nil case stomp.V12: version = stomp.V12 err = nil } } } else { // CONNECT frames can be missing the accept-version header, // we assume V1.0 in this case. STOMP frames were introduced // in V1.1, so they must have an accept-version header. if isConnect { // no "accept-version" header, so we assume 1.0 version = stomp.V10 err = nil } else { err = missingHeader(frame.AcceptVersion) } } return }