-
Notifications
You must be signed in to change notification settings - Fork 2
/
hub_resource_request.go
72 lines (57 loc) · 1.88 KB
/
hub_resource_request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package homehub
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/httputil"
"net/url"
"strings"
)
type hubResourceRequest struct {
authData authData
URL string
prev request
}
func newHubResourceRequest(authData *authData, URL string, prev request) (req *hubResourceRequest) {
return &hubResourceRequest{*authData, URL, prev}
}
func (r *hubResourceRequest) send() (re *response, err error) {
resp, err := r.prev.send()
if err != nil {
return nil, err
}
filePath := resp.ResponseBody.Reply.ResponseActions[0].ResponseCallbacks[0].Parameters.URI
if filePath == "" {
filePath = resp.ResponseBody.Reply.ResponseActions[0].ResponseCallbacks[0].Parameters.Data
}
sessionData := newSessionData(&r.authData)
cj, _ := json.Marshal(sessionData)
baseURL := strings.Replace(r.URL, "/cgi/json-req", "", 1)
httpRequest, _ := http.NewRequest("GET", baseURL+"/"+filePath, nil)
httpRequest.Header.Set("Accept", "application/json, text/plain, */*")
httpRequest.Header.Set("Accept-Encoding", "gzip, deflate")
httpRequest.Header.Set("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6")
httpRequest.AddCookie(&http.Cookie{Name: "lang", Value: "en"})
httpRequest.AddCookie(&http.Cookie{Name: "session", Value: url.QueryEscape(string(cj))})
dump, _ := httputil.DumpRequest(httpRequest, true)
debug.Println(string(dump))
httpClient := &http.Client{}
httpResponse, err := httpClient.Do(httpRequest)
if err != nil {
return nil, err
}
dump, _ = httputil.DumpResponse(httpResponse, true)
debug.Println(string(dump))
if httpResponse.StatusCode >= 400 {
return nil, fmt.Errorf("Error processing request. Hub returned HTTP response code: %d", httpResponse.StatusCode)
}
defer httpResponse.Body.Close()
response := &response{}
bodyBytes, err := ioutil.ReadAll(httpResponse.Body)
if err != nil {
return nil, err
}
response.body = string(bodyBytes[:])
return response, nil
}