Passed
Push — master ( d0843d...15e52a )
by Emre
01:32
created

main.singleProcess   A

Complexity

Conditions 4

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 16
nop 2
dl 0
loc 24
rs 9.6
c 0
b 0
f 0
1
package main
2
3
import (
4
	"encoding/xml"
5
	"fmt"
6
    "time"
7
	"net/http"
8
	"os"
9
)
10
11
// URLSet is root for site mite
12
type URLSet struct {
13
	XMLName xml.Name `xml:"urlset"`
14
	XMLNs   string   `xml:"xmlns,attr"`
15
	URL     []URL    `xml:"url"`
16
}
17
18
// URL is for every single location url
19
type URL struct {
20
	Loc        string  `xml:"loc"`
21
	LastMod    string  `xml:"lastmod,omitempty"`
22
	ChangeFreq string  `xml:"changefreq,omitempty"`
23
	Priority   float32 `xml:"priority,omitempty"`
24
}
25
26
type ValidURL struct{
0 ignored issues
show
introduced by
exported type ValidURL should have comment or be unexported
Loading history...
27
    IsValid bool
28
    URL URL
29
    StatusCode int
30
}
31
32
func (us *URLSet) saveToFile(filename string) error {
33
	m, err := xml.Marshal((*us))
34
	if err != nil {
35
		return err
36
	}
37
38
	file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
39
	file.Write([]byte(xml.Header))
40
	file.Write(m)
41
	file.Close()
42
	return err
43
}
44
45
func (us *URLSet) validate() URLSet {
46
    client := &http.Client{
47
        Timeout: 10*time.Second,
48
    }
49
    validURLChannel := make(chan ValidURL)
50
51
52
	for _, url := range (*us).URL {
53
		go func(url URL, validURLChannel chan ValidURL) {
54
			resp, err := client.Get(url.Loc)
55
            statusCode := (*resp).StatusCode
56
            validURL := ValidURL {
57
                IsValid: err == nil && statusCode == 200,
58
                URL: url,
59
                StatusCode: statusCode,
60
            }
61
            validURLChannel <- validURL
62
		}(url, validURLChannel)
63
	}
64
65
	newURLSet := URLSet{
66
		XMLNs: us.XMLNs,
67
	}
68
69
	for range us.URL {
70
        validURL:= <-validURLChannel
71
        if validURL.IsValid {
72
		    newURLSet.URL = append(newURLSet.URL, validURL.URL)
73
        }else{
74
            fmt.Printf("Url is dead (%s): %s \n",validURL.StatusCode,validURL.URL.Loc)
0 ignored issues
show
introduced by
arg validURL.StatusCode for printf verb %s of wrong type: int
Loading history...
75
        }
76
	}
77
        close(validURLChannel)
78
79
	return newURLSet
80
}
81
//i will use first parameter to determine sitemapIndex or not.
82
func newURLSetFromXML(rawXMLData []byte) (bool,URLSet) {
83
	us := URLSet{}
84
85
	err := xml.Unmarshal(rawXMLData, &us)
86
87
	if err != nil { //some kind of goto
88
        sitemapIndex := newSitemapIndexFromXML(rawXMLData)
89
        sitemapIndexValidate(sitemapIndex)
90
        return true, URLSet{}
91
	}
92
	return false,us
93
}
94
95
func singleProcess(uri string, filename string) {
96
    client := &http.Client{
97
        Timeout: 10*time.Second,
98
    }
99
100
    resp, err := client.Get(uri)
101
    if err != nil {
102
        fmt.Printf("Url cannot fetched: %s\n", uri)
103
        fmt.Println(err)
104
        os.Exit(1)
105
    }
106
107
    rawXMLData := readXMLFromResponse(resp)
108
109
    isJumped, urlSet := newURLSetFromXML(rawXMLData)
110
    if !isJumped { 
111
112
        newURLSet := urlSet.validate()
113
114
        err = newURLSet.saveToFile(filename)
115
116
        if err != nil {
117
            fmt.Println(err)
118
            os.Exit(1)
119
        }
120
    }
121
}
122