WIP: use xml Name

pull/29/head
Martin/Geno 5 years ago
parent 4c23014051
commit 7902e79f81
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A

@ -43,7 +43,7 @@ func authPlain(socket io.ReadWriter, decoder *xml.Decoder, user string, password
// v.Any is type of sub-element in failure, which gives a description of what failed. // v.Any is type of sub-element in failure, which gives a description of what failed.
return errors.New("auth failure: " + v.Any.Local) return errors.New("auth failure: " + v.Any.Local)
default: default:
return errors.New("expected SASL success or failure, got " + v.Name()) return errors.New("expected SASL success or failure, got " + v.Name().Local)
} }
return err return err
} }
@ -60,8 +60,8 @@ type SASLSuccess struct {
XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-sasl success"` XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-sasl success"`
} }
func (SASLSuccess) Name() string { func (s SASLSuccess) Name() xml.Name {
return "sasl:success" return s.XMLName
} }
type saslSuccessDecoder struct{} type saslSuccessDecoder struct{}
@ -82,8 +82,8 @@ type SASLFailure struct {
Any xml.Name // error reason is a subelement Any xml.Name // error reason is a subelement
} }
func (SASLFailure) Name() string { func (x SASLFailure) Name() xml.Name {
return "sasl:failure" return x.XMLName
} }
type saslFailureDecoder struct{} type saslFailureDecoder struct{}
@ -111,6 +111,10 @@ type BindBind struct {
Jid string `xml:"jid,omitempty"` Jid string `xml:"jid,omitempty"`
} }
func (b BindBind) Name() xml.Name {
return b.XMLName
}
// Session is obsolete in RFC 6121. // Session is obsolete in RFC 6121.
// Added for compliance with RFC 3121. // Added for compliance with RFC 3121.
// Remove when ejabberd purely conforms to RFC 6121. // Remove when ejabberd purely conforms to RFC 6121.

@ -73,7 +73,7 @@ func (c *ServerCheck) Check() error {
case StreamError: case StreamError:
return errors.New("open stream error: " + p.Error.Local) return errors.New("open stream error: " + p.Error.Local)
default: default:
return errors.New("expected packet received while expecting features, got " + p.Name()) return errors.New("expected packet received while expecting features, got " + p.Name().Local)
} }
startTLSFeature := f.StartTLS.XMLName.Space + " " + f.StartTLS.XMLName.Local startTLSFeature := f.StartTLS.XMLName.Space + " " + f.StartTLS.XMLName.Local

@ -67,7 +67,7 @@ func (c *Component) Connect(connStr string) error {
case Handshake: case Handshake:
return nil return nil
default: default:
return errors.New("unexpected packet, got " + v.Name()) return errors.New("unexpected packet, got " + v.Name().Local)
} }
panic("unreachable") panic("unreachable")
} }
@ -128,8 +128,8 @@ type Handshake struct {
// Value string `xml:",innerxml"` // Value string `xml:",innerxml"`
} }
func (Handshake) Name() string { func (h Handshake) Name() xml.Name {
return "component:handshake" return h.XMLName
} }
// Handshake decoding wrapper // Handshake decoding wrapper

@ -1,4 +1,4 @@
package xmpp // import "gosrc.io/xmpp/iot" package xmpp // import "gosrc.io/xmpp"
import ( import (
"encoding/xml" "encoding/xml"
@ -10,6 +10,10 @@ type ControlSet struct {
Fields []ControlField `xml:",any"` Fields []ControlField `xml:",any"`
} }
func (c ControlSet) Name() xml.Name {
return c.XMLName
}
type ControlGetForm struct { type ControlGetForm struct {
XMLName xml.Name `xml:"urn:xmpp:iot:control getForm"` XMLName xml.Name `xml:"urn:xmpp:iot:control getForm"`
} }

20
iq.go

@ -154,8 +154,8 @@ func (iq IQ) MakeError(xerror Err) IQ {
return iq return iq
} }
func (IQ) Name() string { func (iq IQ) Name() xml.Name {
return "iq" return iq.XMLName
} }
type iqDecoder struct{} type iqDecoder struct{}
@ -289,6 +289,10 @@ type DiscoInfo struct {
Features []Feature `xml:"feature"` Features []Feature `xml:"feature"`
} }
func (d DiscoInfo) Name() xml.Name {
return d.XMLName
}
type Identity struct { type Identity struct {
XMLName xml.Name `xml:"identity,omitempty"` XMLName xml.Name `xml:"identity,omitempty"`
Name string `xml:"name,attr,omitempty"` Name string `xml:"name,attr,omitempty"`
@ -310,6 +314,10 @@ type DiscoItems struct {
Items []DiscoItem `xml:"item"` Items []DiscoItem `xml:"item"`
} }
func (d DiscoItems) Name() xml.Name {
return d.XMLName
}
type DiscoItem struct { type DiscoItem struct {
XMLName xml.Name `xml:"item"` XMLName xml.Name `xml:"item"`
Name string `xml:"name,attr,omitempty"` Name string `xml:"name,attr,omitempty"`
@ -318,8 +326,8 @@ type DiscoItem struct {
} }
func init() { func init() {
typeRegistry.MapExtension(PKTIQ, xml.Name{"http://jabber.org/protocol/disco#info", "query"}, DiscoInfo{}) typeRegistry.MapExtension(PKTIQ, DiscoInfo{})
typeRegistry.MapExtension(PKTIQ, xml.Name{"http://jabber.org/protocol/disco#items", "query"}, DiscoItems{}) typeRegistry.MapExtension(PKTIQ, DiscoItems{})
typeRegistry.MapExtension(PKTIQ, xml.Name{"urn:ietf:params:xml:ns:xmpp-bind", "bind"}, BindBind{}) typeRegistry.MapExtension(PKTIQ, BindBind{})
typeRegistry.MapExtension(PKTIQ, xml.Name{"urn:xmpp:iot:control", "set"}, ControlSet{}) typeRegistry.MapExtension(PKTIQ, ControlSet{})
} }

@ -18,8 +18,8 @@ type Message struct {
Extensions []MsgExtension `xml:",omitempty"` Extensions []MsgExtension `xml:",omitempty"`
} }
func (Message) Name() string { func (msg Message) Name() xml.Name {
return "message" return msg.XMLName
} }
func NewMessage(msgtype, from, to, id, lang string) Message { func NewMessage(msgtype, from, to, id, lang string) Message {

@ -12,13 +12,21 @@ type Markable struct {
XMLName xml.Name `xml:"urn:xmpp:chat-markers:0 markable"` XMLName xml.Name `xml:"urn:xmpp:chat-markers:0 markable"`
} }
func (m Markable) Name() xml.Name {
return m.XMLName
}
type MarkReceived struct { type MarkReceived struct {
MsgExtension MsgExtension
XMLName xml.Name `xml:"urn:xmpp:chat-markers:0 received"` XMLName xml.Name `xml:"urn:xmpp:chat-markers:0 received"`
ID string ID string
} }
func (m MarkReceived) Name() xml.Name {
return m.XMLName
}
func init() { func init() {
typeRegistry.MapExtension(PKTMessage, xml.Name{"urn:xmpp:chat-markers:0", "markable"}, Markable{}) typeRegistry.MapExtension(PKTMessage, Markable{})
typeRegistry.MapExtension(PKTMessage, xml.Name{"urn:xmpp:chat-markers:0", "received"}, MarkReceived{}) typeRegistry.MapExtension(PKTMessage, MarkReceived{})
} }

@ -14,6 +14,10 @@ type OOB struct {
Desc string `xml:"desc,omitempty"` Desc string `xml:"desc,omitempty"`
} }
func (o OOB) Name() xml.Name {
return o.XMLName
}
func init() { func init() {
typeRegistry.MapExtension(PKTMessage, xml.Name{"jabber:x:oob", "x"}, OOB{}) typeRegistry.MapExtension(PKTMessage, OOB{})
} }

@ -13,13 +13,21 @@ type ReceiptRequest struct {
XMLName xml.Name `xml:"urn:xmpp:receipts request"` XMLName xml.Name `xml:"urn:xmpp:receipts request"`
} }
func (r ReceiptRequest) Name() xml.Name {
return r.XMLName
}
type ReceiptReceived struct { type ReceiptReceived struct {
MsgExtension MsgExtension
XMLName xml.Name `xml:"urn:xmpp:receipts received"` XMLName xml.Name `xml:"urn:xmpp:receipts received"`
ID string ID string
} }
func (r ReceiptReceived) Name() xml.Name {
return r.XMLName
}
func init() { func init() {
typeRegistry.MapExtension(PKTMessage, xml.Name{"urn:xmpp:receipts", "request"}, ReceiptRequest{}) typeRegistry.MapExtension(PKTMessage, ReceiptRequest{})
typeRegistry.MapExtension(PKTMessage, xml.Name{"urn:xmpp:receipts", "received"}, ReceiptReceived{}) typeRegistry.MapExtension(PKTMessage, ReceiptReceived{})
} }

@ -1,7 +1,9 @@
package xmpp // import "gosrc.io/xmpp" package xmpp // import "gosrc.io/xmpp"
import "encoding/xml"
type Packet interface { type Packet interface {
Name() string Name() xml.Name
} }
// PacketAttrs represents the common structure for base XMPP packets. // PacketAttrs represents the common structure for base XMPP packets.

@ -88,54 +88,54 @@ func next(p *xml.Decoder) (Packet, error) {
func decodeStream(p *xml.Decoder, se xml.StartElement) (Packet, error) { func decodeStream(p *xml.Decoder, se xml.StartElement) (Packet, error) {
switch se.Name.Local { switch se.Name.Local {
case "error": case StreamError{}.Name().Local:
return streamError.decode(p, se) return streamError.decode(p, se)
case "features": case StreamFeatures{}.Name().Local:
return streamFeatures.decode(p, se) return streamFeatures.decode(p, se)
default: default:
return nil, errors.New("unexpected XMPP packet " + return nil, errors.New("unexpected stream XMPP packet " +
se.Name.Space + " <" + se.Name.Local + "/>") se.Name.Space + " <" + se.Name.Local + "/>")
} }
} }
func decodeSASL(p *xml.Decoder, se xml.StartElement) (Packet, error) { func decodeSASL(p *xml.Decoder, se xml.StartElement) (Packet, error) {
switch se.Name.Local { switch se.Name.Local {
case "success": case SASLSuccess{}.Name().Local:
return saslSuccess.decode(p, se) return saslSuccess.decode(p, se)
case "failure": case SASLFailure{}.Name().Local:
return saslFailure.decode(p, se) return saslFailure.decode(p, se)
default: default:
return nil, errors.New("unexpected XMPP packet " + return nil, errors.New("unexpected sasl XMPP packet " +
se.Name.Space + " <" + se.Name.Local + "/>") se.Name.Space + " <" + se.Name.Local + "/>")
} }
} }
func decodeClient(p *xml.Decoder, se xml.StartElement) (Packet, error) { func decodeClient(p *xml.Decoder, se xml.StartElement) (Packet, error) {
switch se.Name.Local { switch se.Name.Local {
case "message": case Message{}.Name().Local:
return message.decode(p, se) return message.decode(p, se)
case "presence": case Presence{}.Name().Local:
return presence.decode(p, se) return presence.decode(p, se)
case "iq": case IQ{}.Name().Local:
return iq.decode(p, se) return iq.decode(p, se)
default: default:
return nil, errors.New("unexpected XMPP packet " + return nil, errors.New("unexpected client XMPP packet " +
se.Name.Space + " <" + se.Name.Local + "/>") se.Name.Space + " <" + se.Name.Local + "/>")
} }
} }
func decodeComponent(p *xml.Decoder, se xml.StartElement) (Packet, error) { func decodeComponent(p *xml.Decoder, se xml.StartElement) (Packet, error) {
switch se.Name.Local { switch se.Name.Local {
case "handshake": case Handshake{}.Name().Local:
return handshake.decode(p, se) return handshake.decode(p, se)
case "message": case Message{}.Name().Local:
return message.decode(p, se) return message.decode(p, se)
case "presence": case Presence{}.Name().Local:
return presence.decode(p, se) return presence.decode(p, se)
case "iq": case IQ{}.Name().Local:
return iq.decode(p, se) return iq.decode(p, se)
default: default:
return nil, errors.New("unexpected XMPP packet " + return nil, errors.New("unexpected component XMPP packet " +
se.Name.Space + " <" + se.Name.Local + "/>") se.Name.Space + " <" + se.Name.Local + "/>")
} }
} }

@ -1,4 +1,4 @@
package xmpp // import "gosrc.io/xmpp/pep" package xmpp // import "gosrc.io/xmpp"
import ( import (
"encoding/xml" "encoding/xml"

@ -14,8 +14,8 @@ type Presence struct {
Error Err `xml:"error,omitempty"` Error Err `xml:"error,omitempty"`
} }
func (Presence) Name() string { func (p Presence) Name() xml.Name {
return "presence" return p.XMLName
} }
func NewPresence(from, to, id, lang string) Presence { func NewPresence(from, to, id, lang string) Presence {

@ -6,7 +6,9 @@ import (
"sync" "sync"
) )
type MsgExtension interface{} type MsgExtension interface {
Name() xml.Name
}
// The Registry for msg and IQ types is a global variable. // The Registry for msg and IQ types is a global variable.
// TODO: Move to the client init process to remove the dependency on a global variable. // TODO: Move to the client init process to remove the dependency on a global variable.
@ -49,7 +51,8 @@ func newRegistry() *registry {
// The match is done per packetType (iq, message, or presence) and XML tag name. // The match is done per packetType (iq, message, or presence) and XML tag name.
// You can use the alias "*" as local XML name to be able to match all unknown tag name for that // You can use the alias "*" as local XML name to be able to match all unknown tag name for that
// packet type and namespace. // packet type and namespace.
func (r *registry) MapExtension(pktType packetType, name xml.Name, extension MsgExtension) { func (r *registry) MapExtension(pktType packetType, extension MsgExtension) {
name := extension.Name()
key := registryKey{pktType, name.Space} key := registryKey{pktType, name.Space}
r.msgTypesLock.RLock() r.msgTypesLock.RLock()
store := r.msgTypes[key] store := r.msgTypes[key]

@ -1,7 +1,6 @@
package xmpp // import "gosrc.io/xmpp" package xmpp // import "gosrc.io/xmpp"
import ( import (
"encoding/xml"
"reflect" "reflect"
"testing" "testing"
) )
@ -11,11 +10,14 @@ func TestRegistry_RegisterMsgExt(t *testing.T) {
typeRegistry := newRegistry() typeRegistry := newRegistry()
// Register an element // Register an element
name := xml.Name{Space: "urn:xmpp:receipts", Local: "request"} req := ReceiptRequest{}
typeRegistry.MapExtension(PKTMessage, name, ReceiptRequest{}) res := ReceiptReceived{}
typeRegistry.MapExtension(PKTMessage, req)
typeRegistry.MapExtension(PKTMessage, res)
// Match that element // Match that element
receipt := typeRegistry.GetMsgExtension(name) receipt := typeRegistry.GetMsgExtension(req.Name())
if receipt == nil { if receipt == nil {
t.Error("cannot read element type from registry") t.Error("cannot read element type from registry")
return return
@ -33,12 +35,12 @@ func BenchmarkRegistryGet(b *testing.B) {
typeRegistry := newRegistry() typeRegistry := newRegistry()
// Register an element // Register an element
name := xml.Name{Space: "urn:xmpp:receipts", Local: "request"} req := ReceiptRequest{}
typeRegistry.MapExtension(PKTMessage, name, ReceiptRequest{}) typeRegistry.MapExtension(PKTMessage, req)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
// Match that element // Match that element
receipt := typeRegistry.GetExtensionType(PKTMessage, name) receipt := typeRegistry.GetExtensionType(PKTMessage, req.Name())
if receipt == nil { if receipt == nil {
b.Error("cannot read element type from registry") b.Error("cannot read element type from registry")
return return

@ -17,8 +17,8 @@ type StreamFeatures struct {
Any []xml.Name `xml:",any"` Any []xml.Name `xml:",any"`
} }
func (StreamFeatures) Name() string { func (s StreamFeatures) Name() xml.Name {
return "stream:features" return s.XMLName
} }
type streamFeatureDecoder struct{} type streamFeatureDecoder struct{}
@ -39,8 +39,8 @@ type StreamError struct {
Error xml.Name `xml:",any"` Error xml.Name `xml:",any"`
} }
func (StreamError) Name() string { func (s StreamError) Name() xml.Name {
return "stream:error" return s.XMLName
} }
type streamErrorDecoder struct{} type streamErrorDecoder struct{}

Loading…
Cancel
Save