diff --git a/export.go b/export.go index 2b0befb..8e33598 100644 --- a/export.go +++ b/export.go @@ -10,6 +10,7 @@ import ( var file *os.File var once sync.Once +// Export exports response data as JSON streaming file func Export(response *Response) { once.Do(func() { newFile, err := os.OpenFile("out.json", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) diff --git a/geziyor.go b/geziyor.go index a439b05..7e2811e 100644 --- a/geziyor.go +++ b/geziyor.go @@ -18,13 +18,13 @@ import ( type Geziyor struct { client *http.Client wg sync.WaitGroup - opt Opt + opt Options visitedURLS []string } -// Opt is custom options type for Geziyor -type Opt struct { +// Options is custom options type for Geziyor +type Options struct { AllowedDomains []string StartURLs []string ParseFunc func(response *Response) @@ -37,7 +37,7 @@ func init() { // NewGeziyor creates new Geziyor with default values. // If options provided, options -func NewGeziyor(opt Opt) *Geziyor { +func NewGeziyor(opt Options) *Geziyor { geziyor := &Geziyor{ client: &http.Client{ Timeout: time.Second * 10, @@ -72,6 +72,16 @@ func (g *Geziyor) Get(url string) { g.Do(req) } +// Head issues a HEAD to the specified URL +func (g *Geziyor) Head(url string) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + log.Printf("Request creating error %v\n", err) + return + } + g.Do(req) +} + // Do sends an HTTP request func (g *Geziyor) Do(req *http.Request) { g.wg.Add(1) diff --git a/geziyor_test.go b/geziyor_test.go index 2d565f0..3b76548 100644 --- a/geziyor_test.go +++ b/geziyor_test.go @@ -1,37 +1,38 @@ -package geziyor +package geziyor_test import ( "fmt" "github.com/PuerkitoBio/goquery" "github.com/fpfeng/httpcache" + "github.com/geziyor/geziyor" "testing" ) func TestGeziyor_Simple(t *testing.T) { - NewGeziyor(Opt{ + geziyor.NewGeziyor(geziyor.Options{ StartURLs: []string{"http://api.ipify.org"}, - ParseFunc: func(r *Response) { + ParseFunc: func(r *geziyor.Response) { fmt.Println(string(r.Body)) }, }).Start() } func TestGeziyor_IP(t *testing.T) { - geziyor := NewGeziyor(Opt{ + gez := geziyor.NewGeziyor(geziyor.Options{ StartURLs: []string{"http://api.ipify.org"}, Cache: httpcache.NewMemoryCache(), - ParseFunc: func(r *Response) { + ParseFunc: func(r *geziyor.Response) { fmt.Println(string(r.Body)) r.Geziyor.Get("http://api.ipify.org") }, }) - geziyor.Start() + gez.Start() } func TestGeziyor_HTML(t *testing.T) { - geziyor := NewGeziyor(Opt{ + gez := geziyor.NewGeziyor(geziyor.Options{ StartURLs: []string{"http://quotes.toscrape.com/"}, - ParseFunc: func(r *Response) { + ParseFunc: func(r *geziyor.Response) { r.Doc.Find("div.quote").Each(func(i int, s *goquery.Selection) { // Export Data r.Exports <- map[string]interface{}{ @@ -49,14 +50,14 @@ func TestGeziyor_HTML(t *testing.T) { } }, }) - geziyor.Start() + gez.Start() } func TestGeziyor_Concurrent_Requests(t *testing.T) { - geziyor := NewGeziyor(Opt{ + gez := geziyor.NewGeziyor(geziyor.Options{ AllowedDomains: []string{"quotes.toscrape.com"}, StartURLs: []string{"http://quotes.toscrape.com/"}, - ParseFunc: func(r *Response) { + ParseFunc: func(r *geziyor.Response) { //r.Exports <- map[string]interface{}{"href": r.Request.URL.String()} r.Doc.Find("a").Each(func(i int, s *goquery.Selection) { if href, ok := s.Attr("href"); ok { @@ -65,5 +66,5 @@ func TestGeziyor_Concurrent_Requests(t *testing.T) { }) }, }) - geziyor.Start() + gez.Start() } diff --git a/response.go b/response.go index 7799191..a847972 100644 --- a/response.go +++ b/response.go @@ -6,6 +6,8 @@ import ( "net/url" ) +// Response type wraps http.Response +// Contains parsed response data and Geziyor functions. type Response struct { *http.Response Body []byte @@ -15,6 +17,7 @@ type Response struct { Exports chan map[string]interface{} } +// JoinURL joins base response URL and provided relative URL. func (r *Response) JoinURL(relativeURL string) string { parsedRelativeURL, err := url.Parse(relativeURL) if err != nil {