@@ -11,6 +11,7 @@ import (
1111 "github.com/valyala/fasthttp"
1212 "golang.org/x/time/rate"
1313 "io/ioutil"
14+ "net"
1415 "net/http"
1516 "net/url"
1617 "regexp"
@@ -217,6 +218,8 @@ func ParseFasthttpResponse(originalResp *fasthttp.Response, req *fasthttp.Reques
217218 return resp , nil
218219}
219220
221+
222+
220223func DoFasthttpRequest (req * fasthttp.Request , redirect bool ) (* proto.Response , error ) {
221224 LimitWait ()
222225 defer fasthttp .ReleaseRequest (req )
@@ -346,25 +349,12 @@ func UnzipResponseBody(response *fasthttp.Response) ([]byte, error) {
346349 return body , err
347350}
348351
349- func GenOriginalReq (url string ) (* http.Request , error ) {
350- // 生成原始请求
351- if strings .HasPrefix (url , "http://" ) || strings .HasPrefix (url , "https://" ) {
352- } else {
353- url = "http://" + url
354- }
355- originalReq , err := http .NewRequest ("GET" , url , nil )
352+ func VerifyPortConnection (targetAddr string ) bool {
353+ _ , err := TcpSend (targetAddr , nil )
356354 if err != nil {
357- log .Error ("util/requests.go:GenOriginalReq original request gen error" , url , err )
358- return nil , err
355+ return false
359356 }
360- originalReq .Header .Set ("Host" , originalReq .Host )
361- originalReq .Header .Set ("Accept-Encoding" , "gzip, deflate" )
362- originalReq .Header .Set ("Accept" ,"*/*" )
363- originalReq .Header .Set ("User-Agent" , conf .GlobalConfig .HttpConfig .Headers .UserAgent )
364- originalReq .Header .Set ("Accept-Language" ,"en" )
365- originalReq .Header .Set ("Connection" ,"close" )
366-
367- return originalReq , nil
357+ return true
368358}
369359
370360func VerifyTargetConnection (originalReq * http.Request ) bool {
@@ -398,6 +388,67 @@ func VerifyTargetConnection(originalReq *http.Request) bool {
398388 return true
399389}
400390
391+ func VerifyInputTarget (target string ) (bool , string ) {
392+ // 连通性校验改到这里
393+ // 1.不带https/http协议 && 不带端口:放弃检查(icmp限制太多)
394+ // 2.带端口:tcp 端口
395+ // 3.带https/http协议不带端口:tcp 80/443
396+ // 生成原始请求
397+ verify := true
398+ // 有端口
399+ if len (strings .Split (target ,":" )) > 1 {
400+ // 带端口
401+ if strings .HasPrefix (target , "http://" ) || strings .HasPrefix (target , "https://" ){
402+
403+ }else {
404+ target = "http://" + target
405+ }
406+ } else {
407+ // 不带端口
408+ if strings .HasPrefix (target , "http://" ){
409+ // 输入 http
410+ verify = VerifyPortConnection (net .JoinHostPort (target , "80" ))
411+ } else if strings .HasPrefix (target , "https://" ) {
412+ // 输入 https
413+ verify = VerifyPortConnection (net .JoinHostPort (target , "443" ))
414+ } else {
415+ // 不校验
416+ target = "http://" + target
417+ }
418+ }
419+ return verify , target
420+ }
421+
422+ func GenOriginalReq (target string ) (* http.Request , error ) {
423+ verify , fixTarget := VerifyInputTarget (target )
424+ if ! verify {
425+ errMsg := fmt .Errorf ("util/requests.go:GenOriginalReq %s can not connect" , target )
426+ log .Error (errMsg )
427+ return nil , errMsg
428+ }
429+ originalReq , err := http .NewRequest ("GET" , fixTarget , nil )
430+ if err != nil {
431+ errMsg := fmt .Errorf ("util/requests.go:GenOriginalReq %s original request gen error %v" , target , err )
432+ log .Error (errMsg )
433+ return nil , errMsg
434+ }
435+ originalReq .Header .Set ("Host" , originalReq .Host )
436+ originalReq .Header .Set ("Accept-Encoding" , "gzip, deflate" )
437+ originalReq .Header .Set ("Accept" ,"*/*" )
438+ originalReq .Header .Set ("User-Agent" , conf .GlobalConfig .HttpConfig .Headers .UserAgent )
439+ originalReq .Header .Set ("Accept-Language" ,"en" )
440+ originalReq .Header .Set ("Connection" ,"close" )
441+
442+ // 检查fixUrl连通性
443+ verify = VerifyTargetConnection (originalReq )
444+ if ! verify {
445+ errMsg := fmt .Errorf ("util/requests.go:GenOriginalReq %s can not connect" , fixTarget )
446+ log .Error (errMsg )
447+ return nil , errMsg
448+ }
449+ return originalReq , nil
450+ }
451+
401452func GetOriginalReqBody (originalReq * http.Request ) ([]byte , error ){
402453 var data []byte
403454 if originalReq .Body != nil && originalReq .Body != http .NoBody {
0 commit comments