Слияние кода завершено, страница обновится автоматически
// Copyright 2015 henrylee2cn Author. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package surfer
import (
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"path/filepath"
"strings"
"golang.org/x/net/html/charset"
)
// AutoToUTF8 采用surf内核下载时,可以尝试自动转码为utf8
// 采用phantomjs内核时,无需转码(已是utf8)
func AutoToUTF8(resp *http.Response) error {
destReader, err := charset.NewReader(resp.Body, resp.Header.Get("Content-Type"))
if err == nil {
resp.Body = &RespBody{
ReadCloser: resp.Body,
Reader: destReader,
}
}
return err
}
// BodyBytes 读取完整响应流正文
func BodyBytes(resp *http.Response) ([]byte, error) {
body, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
return body, err
}
// UrlEncode 返回编码后的url.URL指针、及解析错误
func UrlEncode(urlStr string) (*url.URL, error) {
urlObj, err := url.Parse(urlStr)
urlObj.RawQuery = urlObj.Query().Encode()
return urlObj, err
}
// GetWDPath gets the work directory path.
func GetWDPath() string {
wd := os.Getenv("GOPATH")
if wd == "" {
panic("GOPATH is not setted in env.")
}
return wd
}
// IsDirExists judges path is directory or not.
func IsDirExists(path string) bool {
fi, err := os.Stat(path)
if err != nil {
return os.IsExist(err)
} else {
return fi.IsDir()
}
panic("util isDirExists not reached")
}
// IsFileExists judges path is file or not.
func IsFileExists(path string) bool {
fi, err := os.Stat(path)
if err != nil {
return os.IsExist(err)
} else {
return !fi.IsDir()
}
panic("util isFileExists not reached")
}
// WalkDir 遍历目录,可指定后缀
func WalkDir(targpath string, suffixes ...string) (dirlist []string) {
if !filepath.IsAbs(targpath) {
targpath, _ = filepath.Abs(targpath)
}
err := filepath.Walk(targpath, func(retpath string, f os.FileInfo, err error) error {
if err != nil {
return err
}
if !f.IsDir() {
return nil
}
if len(suffixes) == 0 {
dirlist = append(dirlist, retpath)
return nil
}
for _, suffix := range suffixes {
if strings.HasSuffix(retpath, suffix) {
dirlist = append(dirlist, retpath)
}
}
return nil
})
if err != nil {
log.Printf("utils.WalkDir: %v\n", err)
return
}
return
}
// RespBody 封装Response.Body
type RespBody struct {
io.ReadCloser
io.Reader
}
// Read 实现Reader接口
func (b *RespBody) Read(p []byte) (int, error) {
return b.Reader.Read(p)
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )