summaryrefslogtreecommitdiff
path: root/href.go
diff options
context:
space:
mode:
Diffstat (limited to 'href.go')
-rw-r--r--href.go47
1 files changed, 31 insertions, 16 deletions
diff --git a/href.go b/href.go
index 0799fad..a4cc5c9 100644
--- a/href.go
+++ b/href.go
@@ -2,16 +2,19 @@ package main
import (
"errors"
+ "fmt"
"log"
"net/http"
"strings"
- irc "github.com/fluffle/goirc/client"
"golang.org/x/net/html"
"golang.org/x/net/html/charset"
)
-var errNotHTML = errors.New("not HTML content")
+var (
+ errNotHTML = errors.New("Not HTML")
+ errTooBig = errors.New("Content too big")
+)
func title(n *html.Node) (s string) {
if n.Type == html.ElementNode && n.Data == "title" {
@@ -28,7 +31,7 @@ func title(n *html.Node) (s string) {
return ""
}
-func findTitle(uri string) (string, error) {
+func getTitle(uri string) (string, error) {
resp, err := http.Get(uri)
if err != nil {
return "", err
@@ -40,6 +43,10 @@ func findTitle(uri string) (string, error) {
return "", errNotHTML
}
+ if resp.ContentLength > 10*1024*1024 {
+ return "", errTooBig
+ }
+
r, err := charset.NewReader(resp.Body, ct)
if err != nil {
return "", err
@@ -53,26 +60,34 @@ func findTitle(uri string) (string, error) {
return title(doc), nil
}
-func ExtractLinks(conn *irc.Conn, line *irc.Line) {
- for _, v := range strings.Fields(line.Text()) {
+func getLinks(s string) (ret []string) {
+ for _, v := range strings.Fields(s) {
switch {
- case strings.HasPrefix(v, "www"):
+ case strings.HasPrefix(v, "www."):
v = "http://" + v
fallthrough
- case strings.HasPrefix(v, "http"):
- go func(uri string) {
- log.Println(line.Nick, uri)
- t, err := findTitle(uri)
+ case strings.HasPrefix(v, "http:"), strings.HasPrefix(v, "https:"):
+ ret = append(ret, v)
+ }
+ }
+ return
+}
+
+func linker(out chan string) chan string {
+ c := make(chan string, 1)
+ go func() {
+ for l := range c {
+ for _, v := range getLinks(l) {
+ log.Println("URL", v)
+ t, err := getTitle(v)
if err != nil {
log.Println(err)
}
if t != "" {
- if len(t) > maxLen {
- t = t[:maxLen] + "..."
- }
- conn.Notice(line.Target(), "Title: "+t)
+ out <- fmt.Sprintf("Title: %v", t)
}
- }(v)
+ }
}
- }
+ }()
+ return c
}