Do function refactored

This commit is contained in:
Musab Gültekin
2019-06-13 20:12:59 +03:00
parent 7c43585769
commit 76a687e193
2 changed files with 54 additions and 48 deletions

View File

@ -14,8 +14,8 @@ type JSONExporter struct {
FileName string FileName string
EscapeHTML bool EscapeHTML bool
file *os.File
once sync.Once once sync.Once
file *os.File
} }
// Export exports response data as JSON streaming file // Export exports response data as JSON streaming file

View File

@ -137,60 +137,19 @@ func (g *Geziyor) Do(req *Request, callback func(resp *Response)) {
req.Header.Set("Accept-Language", "en") req.Header.Set("Accept-Language", "en")
req.Header.Set("User-Agent", g.Opt.UserAgent) req.Header.Set("User-Agent", g.Opt.UserAgent)
g.acquireSem(req) // Do request and read response
response, err := g.doRequest(req)
g.delay()
log.Println("Fetching: ", req.URL.String())
// Do request
resp, err := g.client.Do(req.Request)
if resp != nil {
defer resp.Body.Close()
}
if err != nil { if err != nil {
log.Printf("Response error: %v\n", err)
g.releaseSem(req)
return return
} }
// Limit response body reading
bodyReader := io.LimitReader(resp.Body, g.Opt.MaxBodySize)
// Start reading body and determine encoding
if !g.Opt.CharsetDetectDisabled {
bodyReader, err = charset.NewReader(bodyReader, resp.Header.Get("Content-Type"))
if err != nil {
log.Printf("Determine encoding error: %v\n", err)
g.releaseSem(req)
return
}
}
body, err := ioutil.ReadAll(bodyReader)
if err != nil {
log.Printf("Reading Body error: %v\n", err)
g.releaseSem(req)
return
}
g.releaseSem(req)
response := Response{
Response: resp,
Body: body,
Meta: req.Meta,
Geziyor: g,
Exports: make(chan interface{}),
}
if response.isHTML() { if response.isHTML() {
response.DocHTML, _ = goquery.NewDocumentFromReader(bytes.NewReader(body)) response.DocHTML, _ = goquery.NewDocumentFromReader(bytes.NewReader(response.Body))
} }
// Exporter functions // Exporter functions
for _, exp := range g.Opt.Exporters { for _, exp := range g.Opt.Exporters {
go exp.Export(&response) go exp.Export(response)
} }
// Drain exports chan if no exporter functions added // Drain exports chan if no exporter functions added
@ -203,15 +162,62 @@ func (g *Geziyor) Do(req *Request, callback func(resp *Response)) {
// Callbacks // Callbacks
if callback != nil { if callback != nil {
callback(&response) callback(response)
} else { } else {
if g.Opt.ParseFunc != nil { if g.Opt.ParseFunc != nil {
g.Opt.ParseFunc(&response) g.Opt.ParseFunc(response)
} }
} }
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
func (g *Geziyor) doRequest(req *Request) (*Response, error) {
g.acquireSem(req)
defer g.releaseSem(req)
g.delay()
log.Println("Fetching: ", req.URL.String())
// Do request
resp, err := g.client.Do(req.Request)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
log.Printf("Response error: %v\n", err)
return nil, err
}
// Limit response body reading
bodyReader := io.LimitReader(resp.Body, g.Opt.MaxBodySize)
// Start reading body and determine encoding
if !g.Opt.CharsetDetectDisabled {
bodyReader, err = charset.NewReader(bodyReader, resp.Header.Get("Content-Type"))
if err != nil {
log.Printf("Determine encoding error: %v\n", err)
return nil, err
}
}
body, err := ioutil.ReadAll(bodyReader)
if err != nil {
log.Printf("Reading Body error: %v\n", err)
return nil, err
}
response := Response{
Response: resp,
Body: body,
Meta: req.Meta,
Geziyor: g,
Exports: make(chan interface{}),
}
return &response, nil
}
func (g *Geziyor) acquireSem(req *Request) { func (g *Geziyor) acquireSem(req *Request) {
if g.Opt.ConcurrentRequests != 0 { if g.Opt.ConcurrentRequests != 0 {
g.semGlobal <- struct{}{} g.semGlobal <- struct{}{}