diff options
-rw-r--r-- | bridge.go | 68 | ||||
-rw-r--r-- | light.go | 19 |
2 files changed, 40 insertions, 47 deletions
@@ -15,29 +15,6 @@ import ( "io" ) -// type Bridge struct { -// IPAddress string -// Username string -// Info BridgeInfo -// } -// -// type BridgeInfo struct { -// Root struct { -// Device struct { -// DeviceType string `xml:"deviceType"` -// FriendlyName string `xml:"friendlyName"` -// Manufacturer string `xml:"manufacturer"` -// ManufacturerURL string `xml:"manufacturerURL"` -// ModelDescription string `xml:"modelDescription"` -// ModelName string `xml:"modelName"` -// ModelNumber string `xml:"modelNumber"` -// ModelURL string `xml:"modelURL"` -// SerialNumber string `xml:"serialNumber"` -// UDN string `xml:"UDN"` -// } `xml:"device"` -// } `xml:"root"` -// } - type Bridge struct { IPAddress string Username string @@ -63,21 +40,46 @@ type Device struct { UDN string `xml:"UDN"` } -func (self *Bridge) Get(path string) (io.Reader, error) { +func (self *Bridge) Get(path string) ([]byte, io.Reader, error) { resp, err := http.Get("http://" + self.IPAddress + path) - if err != nil { - trace("", err) - } else if resp.StatusCode != 200 { - trace(fmt.Sprintf("Bridge status error: %d", resp.StatusCode), nil) + if self.Error(resp, err) { + return []byte{}, nil, err } - //defer resp.Body.Close() + return handleResponse(resp) +} + +func (self *Bridge) Post(path string) ([]byte, io.Reader, error) { + // resp, err := http.Post("http://" + self.IpAddress + path) + // if err != nil { + // trace("", err) + // } + return []byte{}, nil, nil +} + +// HandleResponse manages the http.Response from a bridge Get/Put/Post/Delete +// by checking it for errors and invalid return types. +func handleResponse(resp *http.Response) ([]byte, io.Reader, error) { body, err := ioutil.ReadAll(resp.Body) if err != nil { trace("Error parsing bridge description xml.", nil) + return []byte{}, nil, err } reader := bytes.NewReader(body) - // TODO: handle individual error codes - return reader, nil + + return body, reader, nil +} + +// bridge.Error handles any bridge request or response errors +func (self *Bridge) Error(resp *http.Response, err error) (bool) { + if err != nil { + trace("", err) + return true + } else if resp.StatusCode != 200 { + // TODO: handle other status codes + trace(fmt.Sprintf("Bridge status error: %d", resp.StatusCode), nil) + return true + } + return false } // Error Struct @@ -158,7 +160,7 @@ func NewBridge(ip string, username string) *Bridge { // GetBridgeInfo retreives the description.xml file from the bridge. func GetBridgeInfo(self *Bridge) Error { - reader, err := self.Get("/description.xml") + _, reader, err := self.Get("/description.xml") if err != nil { return ErrResponse } @@ -169,7 +171,7 @@ func GetBridgeInfo(self *Bridge) Error { os.Exit(1) } self.Info = data - fmt.Println("Bridge Info:\n", self.Info) + //fmt.Println("Bridge Info:\n", self.Info) return NoErr } @@ -76,8 +76,10 @@ func SetLightState(bridge *Bridge, lightID string, newState LightState) error { return err } + _ = body + // TODO: Parse the response and return any error - fmt.Println(string(body)) + //fmt.Println("LightState: ", string(body)) return nil } @@ -89,20 +91,9 @@ func GetAllLights(bridge *Bridge) ([]Light, error) { for index := 1; index < 101; index++ { // Send an http GET and inspect the response - resp, err := http.Get( - fmt.Sprintf("http://%s/api/%s/lights/%d", bridge.IPAddress, bridge.Username, index)) + uri := fmt.Sprintf("/api/%s/lights/%d", bridge.Username, index) + body, _, err := bridge.Get(uri) if err != nil { - trace("", err) - return lights, err - } else if resp.StatusCode != 200 { - trace(fmt.Sprintf("Bridge status error %d", resp.StatusCode), nil) - } - - // Read and inspect the response content - body, err := ioutil.ReadAll(resp.Body) - defer resp.Body.Close() - if err != nil { - trace("", err) return lights, err } if strings.Contains(string(body), "not available") { |