http.go 4.1 KB
Newer Older
1
package client
2 3

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"encoding/json"
5
	"github.com/ajg/form"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6
	"github.com/easysoft/zentaoatf/src/model"
7
	"github.com/easysoft/zentaoatf/src/utils/log"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	"github.com/easysoft/zentaoatf/src/utils/vari"
9
	"github.com/fatih/color"
10 11
	"io/ioutil"
	"net/http"
12
	"regexp"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13
	"strings"
14 15
)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
16
func Get(url string, params map[string]string) (string, bool) {
17
	logUtils.PrintToCmd(url, -1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18 19
	client := &http.Client{}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
20 21
	req, reqErr := http.NewRequest("GET", url, nil)
	if reqErr != nil {
22
		logUtils.PrintToCmd(reqErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
23
		return "", false
aaronchen2k2k's avatar
aaronchen2k2k 已提交
24 25
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
26
	req.Header.Set("cookie", vari.SessionVar+"="+vari.SessionId)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
27 28

	q := req.URL.Query()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
29
	q.Add(vari.SessionVar, vari.SessionId)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30 31 32 33 34
	if params != nil {
		for pkey, pval := range params {
			q.Add(pkey, pval)
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
35 36
	}
	req.URL.RawQuery = q.Encode()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37

aaronchen2k2k's avatar
aaronchen2k2k 已提交
38 39
	resp, respErr := client.Do(req)
	if respErr != nil {
40
		logUtils.PrintToCmd(respErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41
		return "", false
aaronchen2k2k's avatar
aaronchen2k2k 已提交
42 43
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
44
	bodyStr, _ := ioutil.ReadAll(resp.Body)
45
	logUtils.PrintUnicode(bodyStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46 47

	var bodyJson model.ZentaoResponse
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49
	jsonErr := json.Unmarshal(bodyStr, &bodyJson)
	if jsonErr != nil {
50
		logUtils.PrintToCmd(jsonErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51 52
		return "", false
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
53 54

	defer resp.Body.Close()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56 57 58 59 60

	status := bodyJson.Status
	if status == "" { // 非嵌套结构
		return string(bodyStr), true
	} else { // 嵌套结构
		dataStr := bodyJson.Data
61
		return dataStr, status == "success"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
62
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
63 64
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
65
func PostObject(url string, params interface{}) (string, bool) {
66
	logUtils.PrintToCmd(url, -1)
67 68
	client := &http.Client{}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70
	val, _ := form.EncodeToString(params)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
71
	// convert data to post fomat
aaronchen2k2k's avatar
aaronchen2k2k 已提交
72 73 74
	re3, _ := regexp.Compile(`([^&]*?)=`)
	data := re3.ReplaceAllStringFunc(val, replacePostData)

75
	logUtils.PrintToCmd(data, -1)
76

aaronchen2k2k's avatar
aaronchen2k2k 已提交
77 78
	req, reqErr := http.NewRequest("POST", url, strings.NewReader(data))
	if reqErr != nil {
79
		logUtils.PrintToCmd(reqErr.Error(), color.FgRed)
80 81 82
		return "", false
	}

83
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
84 85
	req.Header.Set("cookie", vari.SessionVar+"="+vari.SessionId)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
86 87
	resp, respErr := client.Do(req)
	if respErr != nil {
88
		logUtils.PrintToCmd(respErr.Error(), color.FgRed)
89 90 91 92
		return "", false
	}

	bodyStr, _ := ioutil.ReadAll(resp.Body)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
	logUtils.PrintUnicode(bodyStr)
94 95

	var bodyJson model.ZentaoResponse
aaronchen2k2k's avatar
aaronchen2k2k 已提交
96 97
	jsonErr := json.Unmarshal(bodyStr, &bodyJson)
	if jsonErr != nil {
98
		logUtils.PrintToCmd(jsonErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99 100
		return "", false
	}
101 102 103 104 105 106 107 108

	defer resp.Body.Close()

	status := bodyJson.Status
	if status == "" { // 非嵌套结构
		return string(bodyStr), true
	} else { // 嵌套结构
		dataStr := bodyJson.Data
109
		return dataStr, status == "success"
110 111 112 113
	}
}

func PostStr(url string, params map[string]string) (string, bool) {
114
	logUtils.PrintToCmd(url, -1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
115
	client := &http.Client{}
116

aaronchen2k2k's avatar
aaronchen2k2k 已提交
117 118 119 120 121 122 123 124
	paramStr := ""
	idx := 0
	for pkey, pval := range params {
		if idx > 0 {
			paramStr += "&"
		}
		paramStr = paramStr + pkey + "=" + pval
		idx++
125 126
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
127 128
	req, reqErr := http.NewRequest("POST", url, strings.NewReader(paramStr))
	if reqErr != nil {
129
		logUtils.PrintToCmd(reqErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
		return "", false
131 132
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
133
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
134
	req.Header.Set("cookie", vari.SessionVar+"="+vari.SessionId)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
135

aaronchen2k2k's avatar
aaronchen2k2k 已提交
136 137
	resp, respErr := client.Do(req)
	if respErr != nil {
138
		logUtils.PrintToCmd(respErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
139
		return "", false
140 141
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
142
	bodyStr, _ := ioutil.ReadAll(resp.Body)
143
	logUtils.PrintUnicode(bodyStr)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
144 145

	var bodyJson model.ZentaoResponse
aaronchen2k2k's avatar
aaronchen2k2k 已提交
146
	jsonErr := json.Unmarshal(bodyStr, &bodyJson)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
147
	if jsonErr != nil && strings.Index(url, "login") == -1 { // ignore login request which return a html
148
		logUtils.PrintToCmd(jsonErr.Error(), color.FgRed)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
149 150
		return "", false
	}
151 152

	defer resp.Body.Close()
aaronchen2k2k's avatar
aaronchen2k2k 已提交
153 154 155 156 157 158

	status := bodyJson.Status
	if status == "" { // 非嵌套结构
		return string(bodyStr), true
	} else { // 嵌套结构
		dataStr := bodyJson.Data
159
		return dataStr, status == "success"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
160
	}
161
}
162 163

func replacePostData(str string) string {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
164 165 166 167
	//logUtils.PrintToCmd(str)
	//logUtils.PrintToCmd(str[:1])
	//logUtils.PrintToCmd(str[1:])
	//logUtils.PrintToCmd("---")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
168 169 170 171 172 173 174

	str = strings.ToLower(str[:1]) + str[1:]

	if strings.Index(str, ".") > -1 {
		str = strings.Replace(str, ".", "[", -1)
		str = strings.Replace(str, "=", "]=", -1)
	}
175 176
	return str
}