Skip to content

Commit ee008d3

Browse files
committed
all: gracefully handle shaky network
1 parent ca1c92f commit ee008d3

File tree

4 files changed

+117
-20
lines changed

4 files changed

+117
-20
lines changed

cached_table.go

Lines changed: 33 additions & 0 deletions
Large diffs are not rendered by default.

fetch_timetable.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright ©2016 The ji-web-display Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
// +build ignore
6+
7+
package main
8+
9+
import (
10+
"encoding/base64"
11+
"flag"
12+
"fmt"
13+
"io"
14+
"log"
15+
"net/http"
16+
"os"
17+
)
18+
19+
func main() {
20+
21+
id := flag.Int("id", 12779, "timetable ID")
22+
host := flag.String("host", "indico.in2p3.fr", "Indico server")
23+
24+
flag.Parse()
25+
26+
url := fmt.Sprintf(
27+
"https://%s/export/timetable/%d.json?pretty=yes",
28+
*host, *id,
29+
)
30+
31+
resp, err := http.Get(url)
32+
if err != nil {
33+
log.Fatal(err)
34+
}
35+
defer resp.Body.Close()
36+
37+
w := base64.NewEncoder(base64.StdEncoding, os.Stdout)
38+
defer w.Close()
39+
40+
_, err = io.Copy(w, resp.Body)
41+
if err != nil {
42+
log.Fatal(err)
43+
}
44+
45+
err = w.Close()
46+
if err != nil {
47+
log.Fatal(err)
48+
}
49+
}

indico/indico.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package indico
77
import (
88
"encoding/json"
99
"fmt"
10+
"io/ioutil"
1011
"net/http"
1112
"strconv"
1213
"time"
@@ -178,26 +179,39 @@ func FetchTimeTable(host string, evtid int) (*TimeTable, error) {
178179
}
179180
defer resp.Body.Close()
180181

181-
var raw timetableResponse
182-
err = json.NewDecoder(resp.Body).Decode(&raw)
182+
buf, err := ioutil.ReadAll(resp.Body)
183+
if err != nil {
184+
return nil, err
185+
}
186+
187+
tbl := TimeTable{ID: evtid}
188+
err = json.Unmarshal(buf, &tbl)
183189
if err != nil {
184190
return nil, err
185191
}
186192

193+
return &tbl, err
194+
}
195+
196+
func (tbl *TimeTable) UnmarshalJSON(data []byte) error {
197+
var raw timetableResponse
198+
err := json.Unmarshal(data, &raw)
199+
if err != nil {
200+
return err
201+
}
202+
187203
if !raw.Complete {
188-
return nil, fmt.Errorf("indico: incomplete timetable")
204+
return fmt.Errorf("indico: incomplete timetable")
189205
}
190206

207+
evtid := tbl.ID
191208
mdays, ok := raw.Results[strconv.Itoa(evtid)]
192209
if !ok || len(mdays) == 0 {
193-
return nil, fmt.Errorf("indico: no event with id=%d", evtid)
210+
return fmt.Errorf("indico: no event with id=%d", evtid)
194211
}
195212

196-
tbl := &TimeTable{
197-
ID: evtid,
198-
URL: raw.URL,
199-
Days: make([]Day, 0, len(mdays)),
200-
}
213+
tbl.URL = raw.URL
214+
tbl.Days = make([]Day, 0, len(mdays))
201215

202216
for k, mday := range mdays {
203217
day := Day{
@@ -207,7 +221,7 @@ func FetchTimeTable(host string, evtid int) (*TimeTable, error) {
207221
var session Session
208222
err = json.Unmarshal(msession, &session)
209223
if err != nil {
210-
return nil, err
224+
return err
211225
}
212226
session.sanitize()
213227
day.Sessions = append(day.Sessions, session)
@@ -218,10 +232,10 @@ func FetchTimeTable(host string, evtid int) (*TimeTable, error) {
218232
}
219233
day.Date, err = time.ParseInLocation("20060102", k, loc)
220234
if err != nil {
221-
return nil, err
235+
return err
222236
}
223237
tbl.Days = append(tbl.Days, day)
224238
}
225239

226-
return tbl, nil
240+
return nil
227241
}

main.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,21 @@ func main() {
6464
host = getHostIP()
6565
}
6666

67+
var tbl *indico.TimeTable
68+
6769
_, err = net.LookupIP("indico.in2p3.fr")
6870
if err != nil {
6971
log.Printf("error looking up 'indico.in2p3.fr': %v\n", err)
70-
log.Printf("sleeping for 5s...\n")
71-
time.Sleep(5 * time.Second)
72-
_, err = net.LookupIP("indico.in2p3.fr")
72+
log.Printf("loading cached table...\n")
73+
tbl, err = loadCachedTable(*evtid)
74+
if err != nil {
75+
log.Fatal(err)
76+
}
77+
} else {
78+
tbl, err = indico.FetchTimeTable("indico.in2p3.fr", *evtid)
7379
if err != nil {
7480
log.Fatal(err)
7581
}
76-
}
77-
78-
tbl, err := indico.FetchTimeTable("indico.in2p3.fr", *evtid)
79-
if err != nil {
80-
log.Fatal(err)
8182
}
8283
sortTimeTable(tbl)
8384

0 commit comments

Comments
 (0)