3.1.1.2 Protocol Grammar

This section uses the Augmented Backus-Naur Form (ABNF) notation that is specified in [RFC2234] to define the protocol stream grammar. ProtocolStream-a represents the stream of octets flowing from the initiator to the receiver, and ProtocolStream-b represents the stream of octets flowing from the receiver to the initiator.

 ProtocolStream-a = 1*(SingletonUnsizedStream-a / DuplexStream-a / SimplexStream-a / SingletonSizedStream-a)
  
 ProtocolStream-b = 1*(SingletonUnsizedStream-b / DuplexStream-b)
  
 SingletonUnsizedStream-a = VersionRecord ModeRecordType SingletonUnsizedMode ViaRecord EncodingRecord *UpgradeRequest PreambleEndRecord UnsizedEnvelopeRecord EndRecord
  
 DuplexStream-a = VersionRecord ModeRecordType DuplexMode ViaRecord EncodingRecord *UpgradeRequest PreambleEndRecord *SizedEnvelopeRecord EndRecord
  
 SimplexStream-a = VersionRecord ModeRecordType SimplexMode ViaRecord EncodingRecord PreambleEndRecord *SizedEnvelopeRecord EndRecord
  
 SingletonSizedStream-a = VersionRecord ModeRecordType SingletonSizedMode ViaRecord EncodingRecord Octets
  
 SingletonUnsizedStream-b = (*UpgradeResponse FaultRecord) / (*UpgradeResponse PreambleAckRecord *1UnsizedEnvelopeRecord (FaultRecord / EndRecord))
  
 DuplexStream-b = (*UpgradeResponse FaultRecord) / (*UpgradeResponse PreambleAckRecord *SizedEnvelopeRecord (FaultRecord / EndRecord))
  
 EncodingRecord = KnownEncodingRecord / ExtensibleEncodingRecord
 UpgradeRequest = UpgradeRequestRecord Octets
 UpgradeResponse = UpgradeResponseRecord Octets
  
 VersionRecord = VersionRecordType MajorVersionNumber MinorVersionNumber
 VersionRecordType = %x00 
 MajorVersionNumber = %x01
 MinorVersionNumber = %x00
  
 ModeRecordType = %x01
 SingletonUnsizedMode = %x01
 DuplexMode = %x02
 SimplexMode = %x03
 SingletonSizedMode = %x04
  
 ViaRecord = ViaRecordType EncodedSize Utf8Octets
 ViaRecordType = %x02
  
 KnownEncodingRecord = KnownEncodingRecordType KnownEncodingType
 KnownEncodingType = TextEncoding / BinaryEncoding / MtomEncoding
 BinaryEncoding = BinarySessionlessEncoding / BinarySessionEncoding
 TextEncoding = Soap11TextEncoding / Soap12TextEncoding
 Soap11TextEncoding = Soap11Utf8Encoding / Soap11Utf16Encoding / Soap11UnicodeFFFEEncoding
 Soap12TextEncoding = Soap12Utf8Encoding / Soap12Utf16Encoding / Soap12UnicodeFFFEEncoding
 KnownEncodingRecordType = %x03
 Soap11Utf8Encoding = %x00
 Soap11Utf16Encoding = %x01
 Soap11UnicodeFFFEEncoding = %x02
 Soap12Utf8Encoding = %x03
 Soap12Utf16Encoding = %x04
 Soap12UnicodeFFFEEncoding = %x05
 MtomEncoding = %x06
 BinarySessionlessEncoding = %x07
 BinarySessionEncoding = %x08
  
 ExtensibleEncodingRecord = ExtensibleEncodingRecordType EncodedSize Utf8Octets
 ExtensibleEncodingRecordType = %x04
  
 UnsizedEnvelopeRecord = UnsizedEnvelopeRecordType 1*(EncodedSize Octets) Terminator
 UnsizedEnvelopeRecordType = %x05
 Terminator = %x00
  
 SizedEnvelopeRecord = SizedEnvelopeRecordType EncodedSize Octets
 SizedEnvelopeRecordType = %x06
  
 EndRecord = EndRecordType
 EndRecordType = %x07
  
 FaultRecord = FaultRecordType EncodedSize Utf8Octets
 FaultRecordType = %x08
  
 UpgradeRequestRecord = UpgradeRequestRecordType EncodedSize Utf8Octets 
 UpgradeRequestRecordType = %x09
  
 UpgradeResponseRecord = UpgradeResponseRecordType
 UpgradeResponseRecordType = %x0A
  
 PreambleAckRecord = PreambleAckRecordType
 PreambleAckRecordType = %x0B
  
 PreambleEndRecord = PreambleEndRecordType
 PreambleEndRecordType = %x0C
  
 Utf8Octets = 1*(Utf8Octet)
 Utf8Octet = %x00-7F / %xC2-DF %x80-BF / %xE0-EF %x80-BF %x80-BF / %xF0-F4 %x80-BF %x80-BF %x80-BF 
  
 Octets = 1*(%x00-FF)
  
 EncodedSize = %x01-7F / %x80-FF %x01-7F / %x80-FF %x80-FF %x01-7F / %x80-FF %x80-FF %x80-FF %x01-7F / %x80-FF %x80-FF %x80-FF %x80-FF %x01-07