Added handling of empty multistatus responses
This commit is contained in:
parent
b370513d15
commit
fd0f4bf3c3
|
@ -4,7 +4,6 @@ import (
|
|||
"bufio"
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
|
@ -29,6 +28,10 @@ type ICal struct {
|
|||
eventData []string // sub slice
|
||||
}
|
||||
|
||||
func (i ICal) Valid() bool {
|
||||
return len(i.eventData) > 0
|
||||
}
|
||||
|
||||
// Retrieve the summary (aka title) of the event.
|
||||
func (i ICal) Summary() string {
|
||||
for _, s := range i.eventData {
|
||||
|
@ -195,7 +198,11 @@ func ParseICal(r io.Reader) (*ICal, error) {
|
|||
|
||||
// If we didn't find a start or an end, abort.
|
||||
if eventStart < 0 || eventEnd <= eventStart {
|
||||
return nil, errors.New("calendar item without event")
|
||||
log.Println("Encountered calendar item without event")
|
||||
return &ICal{
|
||||
data: data,
|
||||
eventData: make([]string, 0),
|
||||
}, err
|
||||
}
|
||||
|
||||
return &ICal{
|
||||
|
@ -288,8 +295,10 @@ func (c *CalDAV) GetEvents() ([]CalDAVItem, error) {
|
|||
result := make([]CalDAVItem, 0, len(ms.Response))
|
||||
for _, p := range ms.Response {
|
||||
ical := p.PropStat.Prop.CalendarData
|
||||
item := CalDAVItem{p.HRef, &ical}
|
||||
result = append(result, item)
|
||||
if ical.Valid() {
|
||||
item := CalDAVItem{p.HRef, &ical}
|
||||
result = append(result, item)
|
||||
}
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
@ -174,6 +175,36 @@ END:VCALENDAR` {
|
|||
})
|
||||
}
|
||||
|
||||
func TestXMLUnmarshal(t *testing.T) {
|
||||
response := `<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/"><d:response><d:href>/calendar/</d:href><d:propstat><d:prop><cal:calendar-data/></d:prop><d:status>HTTP/1.1 404 Not Found</d:status></d:propstat></d:response><d:response><d:href>/calendar/f10545b91c12a44ef7ed2ee3aa250df4-z2QSIWY.ics</d:href><d:propstat><d:prop><cal:calendar-data>BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//some//NONSGML Calendar//EN
|
||||
X-WR-Timezone: Europe/London
|
||||
BEGIN:VEVENT
|
||||
DTSTART:20180404T080000Z
|
||||
DTEND:20180404T081500Z
|
||||
DTSTAMP:20180404T070805Z
|
||||
SEQUENCE:1522825685
|
||||
SUMMARY:Test
|
||||
UID:f10545b91c12a44ef7ed2ee3aa250df4-z2QSIWY
|
||||
END:VEVENT
|
||||
END:VCALENDAR</cal:calendar-data></d:prop><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>`
|
||||
ms := &MultiStatus{}
|
||||
err := xml.Unmarshal([]byte(response), ms)
|
||||
if err != nil {
|
||||
t.Fatal("Decoding should have worked")
|
||||
}
|
||||
if len(ms.Response) != 2 {
|
||||
t.Fatal("Invalid number of results.")
|
||||
}
|
||||
if ms.Response[0].PropStat.Prop.CalendarData.Valid() {
|
||||
t.Error("CalendarData 0 should not be valid")
|
||||
}
|
||||
if !ms.Response[1].PropStat.Prop.CalendarData.Valid() {
|
||||
t.Error("CalendarData 1 should be valid")
|
||||
}
|
||||
}
|
||||
|
||||
const icsWithTZ = `BEGIN:VCALENDAR
|
||||
PRODID:-//Ximian//NONSGML Evolution Calendar//EN
|
||||
VERSION:2.0
|
||||
|
|
Loading…
Reference in New Issue