Initial code

Bug: misc:36

Change-Id: I659ce2684ec02960ffa2bdf1636aeccd44f3010e
diff --git a/client/client.go b/client/client.go
new file mode 100644
index 0000000..9ba79f6
--- /dev/null
+++ b/client/client.go
@@ -0,0 +1,95 @@
+package hguclient
+
+import (
+	"errors"
+	"io"
+	"net/http"
+	"net/http/cookiejar"
+	"net/url"
+	"strings"
+
+	"golang.org/x/net/publicsuffix"
+)
+
+const URL_INDEX = "/"
+const URL_LOGIN = "/te_acceso_router.cgi"
+const URL_SIPBASIC = "/voicesip_basic.html"
+const URL_SIPSTOP = "/voicesipstop.cmd"
+const URL_SIPSTART = "/voicesipstart.cmd"
+
+const LOGGED_OUT_SCRIPT = "<script language='javascript'>\nwindow.top.location = \"/\";\n</script>"
+const LOGGED_OUT_SCRIPT_HOME = "src='te_acceso_router.html'"
+
+type Client struct {
+	httpClient http.Client
+	endpoint   string
+	password   string
+}
+
+func New(endpoint string, password string) (*Client, error) {
+	jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
+	if err != nil {
+		return nil, err
+	}
+
+	client := &Client{
+		httpClient: http.Client{
+			Jar: jar,
+		},
+		endpoint: endpoint,
+		password: password,
+	}
+	return client, nil
+}
+
+func (c *Client) LogIn() error {
+	// Visit the homepage to generate the current sessionId cookie
+	c.httpClient.Get(c.endpoint)
+
+	// Log in
+	resp, err := c.httpClient.PostForm(c.endpoint+URL_LOGIN, url.Values{
+		"loginPassword": []string{c.password},
+	})
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != 200 {
+		return errors.New("Status code is not 200.")
+	}
+
+	return nil
+}
+
+func (c *Client) Get(path string, autoLogIn bool) (string, error) {
+	resp, err := c.httpClient.Get(c.endpoint + path)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != 200 {
+		return "", errors.New("Status code is not 200.")
+	}
+	bodyb, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return "", err
+	}
+	body := string(bodyb)
+
+	if !strings.Contains(body, LOGGED_OUT_SCRIPT) {
+		return body, nil
+	}
+	if !autoLogIn {
+		return "", errors.New("User needs to log in")
+	}
+	c.LogIn()
+	return c.Get(path, false)
+}
+
+func (c *Client) IsLoggedIn() (bool, error) {
+  body, err := c.Get("", false)
+  if err != nil {
+    return false, err
+  }
+  return !strings.Contains(body, LOGGED_OUT_SCRIPT_HOME), nil
+}