10 "github.com/mgutz/str"
11 "repo.or.cz/goroutine-traffic-statistics/analysis/defs"
16 handleMovie
= "/movie/"
21 func Parse(logChan defs
.LogDataChan
, pvChan defs
.UrlDataChan
, uvChan defs
.UrlDataChan
) error
{
22 for logStr
:= range logChan
{
23 data
:= cutLogFetchData(logStr
)
27 hasher
:= md5
.Sum([]byte(data
.UserAgnet
+ data
.Refer
))
28 uid
:= hex
.EncodeToString(hasher
[:])
30 uData
:= &defs
.UrlData
{Data
: data
, UserID
: uid
, Node
: formatUrl(data
.Url
, data
.Time
)}
37 func cutLogFetchData(logStr
string) *defs
.DigData
{
38 logStr
= strings
.TrimSpace(logStr
)
39 pos1
:= str
.IndexOf(logStr
, handleDig
, 0)
43 pos1
+= len(handleDig
)
44 pos2
:= str
.IndexOf(logStr
, " HTTP/", pos1
)
45 d
:= str
.Substr(logStr
, pos1
, pos2
-pos1
)
47 urlInfo
, err
:= url
.Parse("http://localhost/?" + d
)
51 data
:= urlInfo
.Query()
53 Time
: data
.Get("time"),
55 Refer
: data
.Get("refer"),
56 UserAgnet
: data
.Get("ua"),
60 func formatUrl(url
, time
string) *defs
.UrlNode
{
61 startMovie
:= str
.IndexOf(url
, handleMovie
, 0)
62 startList
:= str
.IndexOf(url
, handleList
, 0)
63 end
:= str
.IndexOf(url
, handleHTML
, 0)
65 var types defs
.UrlNodeType
68 start
:= startMovie
+ len(handleMovie
)
69 resourceID
= getResourceID(url
, start
, end
)
70 types
= defs
.UrlNodeTypeDetail
71 } else if startList
>= 0 {
72 start
:= startList
+ len(handleList
)
73 resourceID
= getResourceID(url
, start
, end
)
74 types
= defs
.UrlNodeTypeList
77 types
= defs
.UrlNodeTypeIndex
82 ResourceID
: resourceID
,
87 func getResourceID(url
string, start
, end
int) int {
88 s
:= str
.Substr(url
, start
, end
-start
)
90 if i
, err
:= strconv
.Atoi(s
); err
== nil {