Basic test component (disco Info)

This commit is contained in:
Mickael Remond 2018-01-14 16:54:12 +01:00
parent ceeb51ce0e
commit ff2da776d3
No known key found for this signature in database
GPG key ID: E6F6045D79965AA3
2 changed files with 57 additions and 4 deletions

View file

@ -7,11 +7,12 @@ import (
) )
func main() { func main() {
component := xmpp.Component{Host: "mqtt.localhost", Secret: "mypass"} component := MyComponent{Name: "MQTT Component", Category: "gateway", Type: "mqtt"}
component.Connect("localhost:8888") component.xmpp = &xmpp.Component{Host: "mqtt.localhost", Secret: "mypass"}
component.xmpp.Connect("localhost:8888")
for { for {
packet, err := component.ReadPacket() packet, err := component.xmpp.ReadPacket()
if err != nil { if err != nil {
fmt.Println("read error", err) fmt.Println("read error", err)
return return
@ -21,7 +22,7 @@ func main() {
case xmpp.IQ: case xmpp.IQ:
switch inner := p.Payload.(type) { switch inner := p.Payload.(type) {
case *xmpp.Node: case *xmpp.Node:
fmt.Println("Node:", inner.XMLName.Space, inner.XMLName.Local) component.processIQ(p.Type, p.Id, p.From, inner)
default: default:
fmt.Println("default") fmt.Println("default")
} }
@ -30,3 +31,48 @@ func main() {
} }
} }
} }
const (
NSDiscoInfo = "http://jabber.org/protocol/disco#info"
)
type MyComponent struct {
Name string
// Typical categories and types: https://xmpp.org/registrar/disco-categories.html
Category string
Type string
xmpp *xmpp.Component
}
func (c MyComponent) processIQ(iqType, id, from string, inner *xmpp.Node) {
fmt.Println("Node:", inner.XMLName.Space, inner.XMLName.Local)
switch inner.XMLName.Space + " " + iqType {
case NSDiscoInfo + " get":
fmt.Println("Send Disco Info")
result := fmt.Sprintf(`<iq type='result'
from='%s'
to='%s'
id='%s'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity
category='%s'
type='%s'
name='%s'/>
<feature var='http://jabber.org/protocol/disco#info'/>
<feature var='http://jabber.org/protocol/disco#items'/>
</query>
</iq>`, c.xmpp.Host, from, id, c.Category, c.Type, c.Name)
c.xmpp.Send(result)
default:
iqErr := fmt.Sprintf(`<iq type='error'
from='%s'
to='%s'
id='%s'>
<error type="cancel" code="501">
<feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error>
</iq>`, c.xmpp.Host, from, id)
c.xmpp.Send(iqErr)
}
}

View file

@ -94,6 +94,13 @@ func (c *Component) ReadPacket() (Packet, error) {
return next(c.decoder) return next(c.decoder)
} }
func (c *Component) Send(packet string) error {
if _, err := fmt.Fprintf(c.conn, packet); err != nil {
return errors.New("cannot send packet " + err.Error())
}
return nil
}
// ============================================================================ // ============================================================================
// Handshake Packet // Handshake Packet