From b05a0a91c351347ef4e46242d73aa4291cb0e919 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Sun, 8 Jan 2023 16:54:29 +0800 Subject: [PATCH] test&doc: add example and update doc for netutil package --- README.md | 86 ++++++++++++++++++++----------- README_zh-CN.md | 77 ++++++++++++++++++++-------- netutil/http.go | 15 +++--- netutil/http_client.go | 9 ++-- netutil/http_example_test.go | 99 ++++++++++++++++++++++++++++++++++++ netutil/net.go | 24 ++++++--- netutil/net_example_test.go | 91 +++++++++++++++++++++++++++++++++ 7 files changed, 334 insertions(+), 67 deletions(-) create mode 100644 netutil/http_example_test.go create mode 100644 netutil/net_example_test.go diff --git a/README.md b/README.md index 3f23fcf..0ed1bc0 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ import "github.com/duke-git/lancet/v2/condition" [[play](https://go.dev/play/p/W1SSUmt6pvr)] - **Or** : returns false if neither a nor b is truthy. [[doc](https://github.com/duke-git/lancet/blob/main/docs/condition.md#Or)] - [[play](https://go.dev/play/p/UlQTxHaeEkq)]] +[[play](https://go.dev/play/p/UlQTxHaeEkq)]] - **Xor** : returns true if a or b but not both is truthy. [[doc](https://github.com/duke-git/lancet/blob/main/docs/condition.md#Xor)] [[play](https://go.dev/play/p/gObZrW7ZbG8)] @@ -340,8 +340,6 @@ import "github.com/duke-git/lancet/v2/cryptor" [[doc](https://github.com/duke-git/lancet/blob/main/docs/cryptor.md#RsaDecrypt)] [[play](https://go.dev/play/p/uef0q1fz53I)] - - ### 6. Datetime package supports date and time format and compare. ```go @@ -413,8 +411,6 @@ import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap" - **Hashmap** : hash map structure. [[doc](https://github.com/duke-git/lancet/blob/main/docs/datastructure/hashmap.md)] - - ### 8. Fileutil package implements some basic functions for file operations. ```go @@ -514,8 +510,6 @@ import "github.com/duke-git/lancet/v2/function" - **Watcher** : Watcher is used for record code excution time. can start/stop/reset the watch timer. get the elapsed time of function execution. [[doc](https://github.com/duke-git/lancet/blob/main/docs/function.md#Watcher)] - - ### 11. Maputil package includes some functions to manipulate map. ```go @@ -601,26 +595,62 @@ import "github.com/duke-git/lancet/v2/netutil" #### Function list: -- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString) -- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#EncodeUrl) -- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp) -- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps) -- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs) -- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo) -- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetRequestPublicIp) -- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP) -- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsInternalIP) -- [HttpRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpRequest) -- [HttpClient](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpClient) -- [SendRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#SendRequest) -- [DecodeResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#DecodeResponse) -- [StructToUrlValues](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#StructToUrlValues) -- [HttpGetdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet) -- [HttpDeletedeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete) -- [HttpPostdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost) -- [HttpPutdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPut) -- [HttpPatchdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPatch) -- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ParseHttpResponse) +- **ConvertMapToQueryString** : convert map to sorted url query string. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString)] + [[play](https://go.dev/play/p/jnNt_qoSnRi)] +- **EncodeUrl** : encode url(?a=1&b=[2] -> ?a=1&b=%5B2%5D). + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#EncodeUrl)] + [[play](https://go.dev/play/p/bsZ6BRC4uKI)] +- **GetInternalIp** : return internal ipv4. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp)] + [[play](https://go.dev/play/p/5mbu-gFp7ei)] +- **GetIps** : return all ipv4 of current system. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)] + [[play](https://go.dev/play/p/NUFfcEmukx1)] +- **GetMacAddrs** : return mac address of current system. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)] + [[play](https://go.dev/play/p/Rq9UUBS_Xp1)] +- **GetPublicIpInfo** : return [public ip information](http://ip-api.com/json/). + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo)] + [[play](https://go.dev/play/p/YDxIfozsRHR)] +- **GetRequestPublicIp** : return the http request public ip. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetRequestPublicIp)] + [[play](https://go.dev/play/p/kxU-YDc_eBo)] +- **IsPublicIP** : verify a ip is public or not. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP)] + [[play](https://go.dev/play/p/nmktSQpJZnn)] +- **IsInternalIP** : verify an ip is intranet or not. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsInternalIP)] + [[play](https://go.dev/play/p/sYGhXbgO4Cb)] +- **HttpRequest** : a composed http request used for HttpClient send request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpRequest)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **HttpClient** : a http client tool, used for sending http request + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpClient)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **SendRequest** : send http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#SendRequest)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **DecodeResponse** : decode http response into target object. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#DecodeResponse)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **StructToUrlValues** : convert struct to url valuse. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#StructToUrlValues)] + [[play](https://go.dev/play/p/pFqMkM40w9z)] +- **HttpGetdeprecated** : send get http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet)] +- **HttpDeletedeprecated** : send delete http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete)] +- **HttpPostdeprecated** : send post http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost)] +- **HttpPutdeprecated** : send put http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPut)] +- **HttpPatchdeprecated** : send patch http request. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPatch)] +- **ParseHttpResponse** : decode http response into target object. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ParseHttpResponse)] + + ### 14. Random package implements some basic functions to generate random int and string. @@ -679,8 +709,6 @@ import "github.com/duke-git/lancet/v2/retry" [[doc](https://github.com/duke-git/lancet/blob/main/docs/retry.md#RetryTimes)] [[play](https://go.dev/play/p/ssfVeU2SwLO)] - - ### 16. Slice contains some functions to manipulate slice. ```go diff --git a/README_zh-CN.md b/README_zh-CN.md index 7807a81..a8f0ca9 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -600,26 +600,63 @@ import "github.com/duke-git/lancet/v2/netutil" #### 函数列表: -- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString) -- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp) -- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl) -- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps) -- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs) -- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo) -- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetRequestPublicIp) -- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP) -- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP) -- [HttpRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpRequest) -- [HttpClient](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpClient) -- [SendRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#SendRequest) -- [DecodeResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#DecodeResponse) -- [StructToUrlValues](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#StructToUrlValues) -- [HttpGetdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet) -- [HttpDeletedeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete) -- [HttpPostdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost) -- [HttpPutdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPut) -- [HttpPatchdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPatch) -- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ParseHttpResponse) +- **ConvertMapToQueryString** : 将map转换成http查询字符串。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString)] + [[play](https://go.dev/play/p/jnNt_qoSnRi)] +- **EncodeUrl** : 编码url query string的值(?a=1&b=[2] -> ?a=1&b=%5B2%5D)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl)] + [[play](https://go.dev/play/p/bsZ6BRC4uKI)] +- **GetInternalIp** : 获取内部ipv4。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp)] + [[play](https://go.dev/play/p/5mbu-gFp7ei)] +- **GetIps** : 获取系统ipv4地址列表。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetIps)] + [[play](https://go.dev/play/p/NUFfcEmukx1)] +- **GetMacAddrs** : 获取系统mac地址列。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetMacAddrs)] + [[play](https://go.dev/play/p/Rq9UUBS_Xp1)] +- **GetPublicIpInfo** : 获取[公网ip信息](http://ip-api.com/json/). + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo)] + [[play](https://go.dev/play/p/YDxIfozsRHR)] +- **GetRequestPublicIp** : 获取http请求ip。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetRequestPublicIp)] + [[play](https://go.dev/play/p/kxU-YDc_eBo)] +- **IsPublicIP** : 判断ip是否是公共ip。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP)] + [[play](https://go.dev/play/p/nmktSQpJZnn)] +- **IsInternalIP** : 判断ip是否是局域网ip。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP)] + [[play](https://go.dev/play/p/sYGhXbgO4Cb)] +- **HttpRequest** : 用于抽象HTTP请求实体的结构。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpRequest)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **HttpClient** : 用于发送HTTP请求。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpClient)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **SendRequest** : 发送http请求。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#SendRequest)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **DecodeResponse** : 解析http响应体到目标结构体。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#DecodeResponse)] + [[play](https://go.dev/play/p/jUSgynekH7G)] +- **StructToUrlValues** : 将结构体转为url values, 仅转化结构体导出字段并且包含`json` tag。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#StructToUrlValues)] + [[play](https://go.dev/play/p/pFqMkM40w9z)] +- **HttpGetdeprecated** : 发送http get请求(已弃用:SendRequest代替)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet)] +- **HttpDeletedeprecated** : 发送http delete请求(已弃用:SendRequest代替)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete)] +- **HttpPostdeprecated** : 发送http post请求(已弃用:SendRequest代替)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost)] +- **HttpPutdeprecated** : 发送http put请求(已弃用:SendRequest代替)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPut)] +- **HttpPatchdeprecated** : 发送http patch请求(已弃用:SendRequest代替)。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPatch)] +- **ParseHttpResponse** : 解析http响应体到目标结构体。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ParseHttpResponse)] + + + ### 14. random 随机数生成器包,可以生成随机[]bytes, int, string。 diff --git a/netutil/http.go b/netutil/http.go index a6484cc..1db8f8c 100644 --- a/netutil/http.go +++ b/netutil/http.go @@ -21,32 +21,32 @@ import ( "strings" ) -//HttpGet send get http request +// HttpGet send get http request. func HttpGet(url string, params ...any) (*http.Response, error) { return doHttpRequest(http.MethodGet, url, params...) } -//HttpPost send post http request +// HttpPost send post http request. func HttpPost(url string, params ...any) (*http.Response, error) { return doHttpRequest(http.MethodPost, url, params...) } -//HttpPut send put http request +// HttpPut send put http request. func HttpPut(url string, params ...any) (*http.Response, error) { return doHttpRequest(http.MethodPut, url, params...) } -//HttpDelete send delete http request +// HttpDelete send delete http request. func HttpDelete(url string, params ...any) (*http.Response, error) { return doHttpRequest(http.MethodDelete, url, params...) } -// HttpPatch send patch http request +// HttpPatch send patch http request. func HttpPatch(url string, params ...any) (*http.Response, error) { return doHttpRequest(http.MethodPatch, url, params...) } -// ParseHttpResponse decode http response to specified interface +// ParseHttpResponse decode http response to specified interface. func ParseHttpResponse(resp *http.Response, obj any) error { if resp == nil { return errors.New("InvalidResp") @@ -55,7 +55,8 @@ func ParseHttpResponse(resp *http.Response, obj any) error { return json.NewDecoder(resp.Body).Decode(obj) } -// ConvertMapToQueryString convert map to sorted url query string +// ConvertMapToQueryString convert map to sorted url query string. +// Play: https://go.dev/play/p/jnNt_qoSnRi func ConvertMapToQueryString(param map[string]any) string { if param == nil { return "" diff --git a/netutil/http_client.go b/netutil/http_client.go index 25f14d8..44a1a3a 100644 --- a/netutil/http_client.go +++ b/netutil/http_client.go @@ -92,7 +92,8 @@ func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient { return client } -// SendRequest send http request +// SendRequest send http request. +// Play: https://go.dev/play/p/jUSgynekH7G func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error) { err := validateRequest(request) if err != nil { @@ -128,7 +129,8 @@ func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, err return resp, nil } -// DecodeResponse decode response into target object +// DecodeResponse decode response into target object. +// Play: https://go.dev/play/p/jUSgynekH7G func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error { if resp == nil { return errors.New("invalid target param") @@ -203,7 +205,8 @@ func validateRequest(req *HttpRequest) error { } // StructToUrlValues convert struct to url valuse, -// only convert the field which is exported and has `json` tag +// only convert the field which is exported and has `json` tag. +// Play: https://go.dev/play/p/pFqMkM40w9z func StructToUrlValues(targetStruct any) url.Values { rv := reflect.ValueOf(targetStruct) rt := reflect.TypeOf(targetStruct) diff --git a/netutil/http_example_test.go b/netutil/http_example_test.go new file mode 100644 index 0000000..71aeebe --- /dev/null +++ b/netutil/http_example_test.go @@ -0,0 +1,99 @@ +package netutil + +import "fmt" + +func ExampleHttpClient_SendRequest() { + request := &HttpRequest{ + RawURL: "https://jsonplaceholder.typicode.com/todos/1", + Method: "GET", + } + + httpClient := NewHttpClient() + resp, err := httpClient.SendRequest(request) + if err != nil || resp.StatusCode != 200 { + return + } + + type Todo struct { + UserId int `json:"userId"` + Id int `json:"id"` + Title string `json:"title"` + Completed bool `json:"completed"` + } + + var todo Todo + err = httpClient.DecodeResponse(resp, &todo) + if err != nil { + return + } + + fmt.Println(todo.Id) + + // Output: + // 1 +} + +func ExampleHttpClient_DecodeResponse() { + request := &HttpRequest{ + RawURL: "https://jsonplaceholder.typicode.com/todos/1", + Method: "GET", + } + + httpClient := NewHttpClient() + resp, err := httpClient.SendRequest(request) + if err != nil || resp.StatusCode != 200 { + return + } + + type Todo struct { + UserId int `json:"userId"` + Id int `json:"id"` + Title string `json:"title"` + Completed bool `json:"completed"` + } + + var todo Todo + err = httpClient.DecodeResponse(resp, &todo) + if err != nil { + return + } + + fmt.Println(todo.Id) + + // Output: + // 1 +} + +func ExampleStructToUrlValues() { + type TodoQuery struct { + Id int `json:"id"` + Name string `json:"name"` + } + todoQuery := TodoQuery{ + Id: 1, + Name: "Test", + } + todoValues := StructToUrlValues(todoQuery) + + fmt.Println(todoValues.Get("id")) + fmt.Println(todoValues.Get("name")) + + // Output: + // 1 + // Test +} + +func ExampleConvertMapToQueryString() { + var m = map[string]any{ + "c": 3, + "a": 1, + "b": 2, + } + + qs := ConvertMapToQueryString(m) + + fmt.Println(qs) + + // Output: + // a=1&b=2&c=3 +} diff --git a/netutil/net.go b/netutil/net.go index cb62aaf..ab4dab2 100644 --- a/netutil/net.go +++ b/netutil/net.go @@ -9,7 +9,8 @@ import ( "strings" ) -// GetInternalIp return internal ipv4 +// GetInternalIp return internal ipv4. +// Play: https://go.dev/play/p/5mbu-gFp7ei func GetInternalIp() string { addr, err := net.InterfaceAddrs() if err != nil { @@ -26,7 +27,8 @@ func GetInternalIp() string { return "" } -// GetRequestPublicIp return the requested public ip +// GetRequestPublicIp return the requested public ip. +// Play: https://go.dev/play/p/kxU-YDc_eBo func GetRequestPublicIp(req *http.Request) string { var ip string for _, ip = range strings.Split(req.Header.Get("X-Forwarded-For"), ",") { @@ -47,7 +49,8 @@ func GetRequestPublicIp(req *http.Request) string { } // GetPublicIpInfo return public ip information -// return the PublicIpInfo struct +// return the PublicIpInfo struct. +// Play: https://go.dev/play/p/YDxIfozsRHR func GetPublicIpInfo() (*PublicIpInfo, error) { resp, err := http.Get("http://ip-api.com/json/") if err != nil { @@ -69,7 +72,8 @@ func GetPublicIpInfo() (*PublicIpInfo, error) { return &ip, nil } -// GetIps return all ipv4 of system +// GetIps return all ipv4 of system. +// Play: https://go.dev/play/p/NUFfcEmukx1 func GetIps() []string { var ips []string @@ -89,7 +93,8 @@ func GetIps() []string { return ips } -// GetMacAddrs get mac address +// GetMacAddrs get mac address. +// Play: https://go.dev/play/p/Rq9UUBS_Xp1 func GetMacAddrs() []string { var macAddrs []string @@ -125,7 +130,8 @@ type PublicIpInfo struct { Ip string `json:"query"` } -// IsPublicIP verify a ip is public or not +// IsPublicIP verify a ip is public or not. +// Play: https://go.dev/play/p/nmktSQpJZnn func IsPublicIP(IP net.IP) bool { if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() { return false @@ -145,7 +151,8 @@ func IsPublicIP(IP net.IP) bool { return false } -// IsInternalIP verify an ip is intranet or not +// IsInternalIP verify an ip is intranet or not. +// Play: https://go.dev/play/p/sYGhXbgO4Cb func IsInternalIP(IP net.IP) bool { if IP.IsLoopback() { return true @@ -159,7 +166,8 @@ func IsInternalIP(IP net.IP) bool { return false } -// EncodeUrl encode url +// EncodeUrl encode url. +// Play: https://go.dev/play/p/bsZ6BRC4uKI func EncodeUrl(urlStr string) (string, error) { URL, err := url.Parse(urlStr) if err != nil { diff --git a/netutil/net_example_test.go b/netutil/net_example_test.go new file mode 100644 index 0000000..a9d967c --- /dev/null +++ b/netutil/net_example_test.go @@ -0,0 +1,91 @@ +package netutil + +import ( + "fmt" + "net" + "net/http" +) + +func ExampleGetInternalIp() { + internalIp := GetInternalIp() + + result := IsInternalIP(net.ParseIP(internalIp)) + fmt.Println(result) + + // Output: + // true +} + +func ExampleGetPublicIpInfo() { + ipInfo, err := GetPublicIpInfo() + if err != nil { + return + } + + result := IsPublicIP(net.ParseIP(ipInfo.Ip)) + fmt.Println(result) + + // Output: + // true +} + +func ExampleGetRequestPublicIp() { + ip := "36.112.24.10" + + request := http.Request{ + Method: "GET", + Header: http.Header{ + "X-Forwarded-For": {ip}, + }, + } + publicIp := GetRequestPublicIp(&request) + + fmt.Println(publicIp) + + // Output: + // 36.112.24.10 +} + +func ExampleIsInternalIP() { + ip1 := IsInternalIP(net.ParseIP("127.0.0.1")) + ip2 := IsInternalIP(net.ParseIP("192.168.0.1")) + ip3 := IsInternalIP(net.ParseIP("36.112.24.10")) + + fmt.Println(ip1) + fmt.Println(ip2) + fmt.Println(ip3) + + // Output: + // true + // true + // false +} + +func ExampleIsPublicIP() { + ip1 := IsPublicIP(net.ParseIP("127.0.0.1")) + ip2 := IsPublicIP(net.ParseIP("192.168.0.1")) + ip3 := IsPublicIP(net.ParseIP("36.112.24.10")) + + fmt.Println(ip1) + fmt.Println(ip2) + fmt.Println(ip3) + + // Output: + // false + // false + // true +} + +func ExampleEncodeUrl() { + urlAddr := "http://www.lancet.com?a=1&b=[2]" + + encodedUrl, err := EncodeUrl(urlAddr) + if err != nil { + return + } + + fmt.Println(encodedUrl) + + // Output: + // http://www.lancet.com?a=1&b=%5B2%5D +}