https

package
v0.2.95 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 8, 2025 License: BSD-3-Clause-Clear Imports: 23 Imported by: 1

README

网址请求增强包

功能

  • 支持自定义请求头
  • 支持自定义请求超时时间
  • 支持请求错误重试
  • 支持请求重定向
  • 支持请求日志
  • 支持请求的前/后钩子处理
  • 支持请求缓存
  • 支持分组并发请求
  • 支持直接下载文件
  • 支持上传文件
  • 支持缓存自定义
  • 支持https请求不验证证书

使用

package main

import (
	"fmt"
	"github.com/xiaoyutab/xgotool/https"
)

func main() {
    // 基础配置项,用于处理请求的基础信息表述

    // 设置是否存储 cookie 默认不存储
    https.SetDefaultUnCookieJar(true)

    // 设置 cookie 的存储结构
    https.SetJar(nil)

    // 设置默认的超时时间,针对所有请求均生效
    https.SetDefaultTimeOut(time.Second * 10)

    // 设置默认的缓存实现,需要实现 https.CacheInterface 接口
    https.SetDefaultCacheFunc(nil)

    // 设置默认的缓存时间,针对所有请求均生效,所以一般不建议配置此值
    https.SetDefaultCacheTime(time.Second * 3)

    // 设置默认请求头
    https.SetDefaultAc("") // 设置请求头 access
    https.SetDefaultUA("") // 设置请求头 user-agent
    https.SetDefaultCT("") // 设置请求头 content-type
    https.SetDefaultAcL("") // 设置请求头 access-language

    // 日志回调函数,用于记录请求日志
    // 此请求会在请求全都完成后才会调用,可用于记录请求日志
    // 多次调用会设置多个日志回调钩子
    // 如果触发了缓存命中,则不会触发日志记录
    https.SetQuestLog(func(c *https.CURL) {})

    // 设置请求前的钩子处理,一般用于token验证;此处传入了空域名,表示验证所有请求
	// 第一个参数为域名参数
	// 传入空字符串``、`*` 均表示所有请求均走此处理函数
	https.SetBeforeHook("", func(c *https.CURL) {
		if len(c.URI) <= 4 || (len(c.URI) > 4 && c.URI[:4] == "http") {
			// 未使用http开头,即不是完整的域名
			c.URI = "http://xiaoyutab.cn/" + c.URI
		}
	})

    // 请求后钩子处理,可用于请求结果的处理(一般用于处理200状态下的统计返回结果,此处以code进行示例)
    https.SetAfterHook("xiaoyutab.cn", func(c *https.CURL) {
        // 定义临时结构体,解析返回结果(建议将此结构体定义于外部,此处定义内部仅作为举例示意)
		type temp_struct struct {
			Code int    `json:"code"`
			Flag bool   `json:"flag"`
			Msg  string `json:"msg"`
			Data any    `json:"data"`
		}
        temp := temp_struct{}
        // 解析返回结果
        err := json.Unmarshal([]byte(c.Body), &temp)
        if err != nil {
            c.Error = fmt.Errorf("解析返回结果失败:%w", err)
            return 
        }
        if temp.Code!= 0 {
            c.Error = fmt.Errorf("请求失败:%s", temp.Msg)
            return 
        }
        // 处理返回结果
        b,_ := json.Marshal(temp.Data)
        c.Body = string(b)
    })

	// 创建请求对象
	err := https.New("https://www.baidu.com").
        HeaderKV("content-type", "application/json").// 设置header请求头
        Header(map[string]string{
			"Authorization": "Bearer 1234567890",
		}). // 批量设置header头信息
        WithOption(
            https.WithTimeOut(time.Second * 10), // 设置请求超时时间
            https.WithCache(time.Second*10), // 设置请求缓存时间,0-不缓存(默认)
            https.WithRetry("", ""), // 错误重试,第一个参数为重试依然失败的回调网址,第二个参数为验证body中的信息包含
            https.WithContext(context.Background()),// 请求上下文控制,可用于超时、取消请求等,用于配合其他程序的并发处理
            https.WithHttpsContinue(), // 支持https请求的证书跳过
            https.WithCookie(nil),// 使用自定义的 cookie-jar 组件
            https.WithNoLog(), // 不记录请求日志(https请求日志会统一记录在外部)
        ).// 增强功能插入
        Get().
        Replace("","").// 请求结果替换,第一个参数为需要替换的字符串,第二个参数为替换后的字符串(此方法为直接替换curl.Body字符串,需要在请求完成后执行)
        Json() // 直接解析到JSON对象中
}

Documentation

Overview

HTTPS请求-带缓存、选项的V2版

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ClearQuestLog added in v0.2.39

func ClearQuestLog()

清除Quest请求日志记录的函数列表

func ClientClose deprecated added in v0.1.24

func ClientClose()

旧版接口兼容 重置_default配置项下的client客户端配置

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func DownloadGet deprecated added in v0.1.6

func DownloadGet(file, url string, param, header map[string]string) error

GET下载文件

file	下载文件的存储文件名【如果存在会追加写入】
url		请求地址
param	请求参数
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func DownloadPost deprecated added in v0.1.6

func DownloadPost(file, uri string, param, header map[string]string) error

POST下载文件

file	下载文件的存储文件名【如果存在会追加写入】
uri		请求地址
param	请求参数
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func DownloadPostJson deprecated added in v0.1.6

func DownloadPostJson(file, url string, param map[string]any, header map[string]string) error

POSTJSON下载文件

file	下载文件的存储文件名【如果存在会追加写入】
url		请求地址
param	请求参数【如果不想封装外层map的话,可直接传入map[string]any{"_":xxx}(会在map最外层有且仅有_下标时才会直接取其内容进行传输)】
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func Gatway

func Gatway(h http.Handler, intef GatwayInterface) http.Handler

网址转发操作【此操作暂不支持通配网址信息】

h	原始请求处理器
intef	网址转发配置

func QueryJsonString added in v0.2.92

func QueryJsonString(outs []byte, path ...string) ([]byte, error)

将结果返回的JSON字符串进行转化、提取成指定路径的JSON字符串

outs	待截取的JSON字符串
path	截取下标,如果是列表类型的话,需要拼成字符串类型再行读取,如"0"、"1"等

func Regedit deprecated added in v0.0.19

func Regedit(c *Config)

注入配置项

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func SetAfterHook added in v0.2.94

func SetAfterHook(domain string, funct func(c *CURL))

设置请求后的钩子函数 此处为使用url.Parse(XXXX).Host的纯域名,请勿添加http之类的前缀 另,所有域名通用的钩子函数请使用"*"作为域名 最后,后添加的钩子函数会覆盖前面的同名钩子函数,经添加钩子时先查找下项目内是否已存在该钩子

domain	域名
funct	请求后的钩子函数

func SetBeforeHook added in v0.2.94

func SetBeforeHook(domain string, funct func(c *CURL))

设置请求前的钩子函数 此处为使用url.Parse(XXXX).Host的纯域名,请勿添加http之类的前缀 另,所有域名通用的钩子函数请使用"*"作为域名 最后,后添加的钩子函数会覆盖前面的同名钩子函数,经添加钩子时先查找下项目内是否已存在该钩子

domain	域名
funct	请求前的钩子函数

func SetDefaultCacheFunc added in v0.2.39

func SetDefaultCacheFunc(t CacheInterface)

设置缓存信息

t	实现缓存方法的接口信息

func SetDefaultCacheTime added in v0.2.39

func SetDefaultCacheTime(t time.Duration)

设置默认的缓存时间 不建议设置此值,若确实需要缓存的话,建议针对URL地址进行配置缓存时间

t	缓存时间

func SetDefaultCt added in v0.2.94

func SetDefaultCt(ct string)

设置默认的Content-Type请求头

ct	Content-Type请求头

func SetDefaultTimeOut added in v0.2.39

func SetDefaultTimeOut(t time.Duration)

设置默认的超时时间

t	超时时间

func SetDefaultUa added in v0.2.94

func SetDefaultUa(ua string)

设置默认的user-agent请求头

ua	UA请求头

func SetDefaultUnCookieJar added in v0.2.41

func SetDefaultUnCookieJar(s bool)

设置默认是否存储cookie

s	是否存储cookie值,默认存储,可以使用此方法跳过cookie的存储

func SetJar added in v0.2.41

func SetJar(jar *cookiejar.Jar)

设置cookie存储的jar信息

jar	存储的jar信息,默认为nil,nil会获取新的cookiejar.New的jar结构体

func SetQuestLog added in v0.2.39

func SetQuestLog(f func(c *CURL))

设置Quest请求日志

f	日志记录函数【此函数会记录多个,所以请勿一直调用SetQuestLog进行插入日志记录函数】

func SwitchAddNoBody deprecated added in v0.2.8

func SwitchAddNoBody(h string)

添加不需要展示Body的URL网址

h	移除body的URL网址

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchAddNoHeader deprecated added in v0.2.8

func SwitchAddNoHeader(h string)

添加不需要展示的Header头

h	要去除的header中的key标示

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchClient deprecated added in v0.1.24

func SwitchClient(client *http.Client)

配置自定义的Http.Client配置项【一旦传入此配置项,将不再使用组件内的配置项,所以一旦传入此项,则超时、跳过证书等选项将失效】 另,此配置项具有继承性,所以在使用完以后请再次使用此项进行重置 defer https.SwitchClient(nil) 或者 defer https.ClientClose() 或若需要继续使用,则直接将其放在https.Regedit()注入配置附近

client	自定义的Client配置

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchGetNoBody deprecated added in v0.2.8

func SwitchGetNoBody() []string

获取不显示Body的配置列表

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchGetNoHeader deprecated added in v0.2.8

func SwitchGetNoHeader() []string

获取不显示Header的配置列表

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchHttps deprecated added in v0.1.23

func SwitchHttps(bol bool)

切换Https参数验证规则

bol	是否跳过HTTPS证书效验 true跳过 false继续验证证书

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchRemoveNoBody deprecated added in v0.2.8

func SwitchRemoveNoBody(h string)

移除不需要展示Body的URL网址

h	要显示的body的URL网址信息

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchRemoveNoHeader deprecated added in v0.2.8

func SwitchRemoveNoHeader(h string)

移除不需要展示的Header头

h	要显示的header中的key标示

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

func SwitchTimeout deprecated added in v0.1.24

func SwitchTimeout(t time.Duration)

设置HTTP请求超时时间

t	设置超时时间,默认0,无超时设置

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,此处不再起作用,在v0.3.x版本中彻底移除

Types

type CURL

type CURL struct {
	URI            string            `json:"uri"`         // 请求网址
	ParamQuest     map[string]string `json:"param"`       // 请求参数
	HttpCode       int               `json:"http_code"`   // HTTP返回的code值
	ParamJsonQuest map[string]any    `json:"param_json"`  // JSON推送参数
	Body           string            `json:"body"`        // 返回值
	Error          error             `json:"error"`       // 错误信息
	HeaderQuest    map[string]string `json:"header"`      // 请求Header头
	CreateTime     time.Time         `json:"create_time"` // 实例创建时间
	StartTime      time.Time         `json:"start_time"`  // 请求开始时间
	EndTime        time.Time         `json:"end_time"`    // 请求结束时间
	OverTime       time.Time         `json:"over_time"`   // JSON提取结束时间
	ClientIP       string            `json:"client_ip"`   // 请求的客户端IP【兼容日志处理模块的预留字段】
	CookieQuest    []string          `json:"cookie"`      // HTTP网址返回的Set-Cookie相应头
	Version        float64           `json:"version"`     // HTTP返回的Header头中的版本信息
	// contains filtered or unexported fields
}

网址服务对象

func Get deprecated

func Get(uri string, param, header map[string]string) *CURL

GET请求

uri		请求地址
param	请求参数
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func New added in v0.2.39

func New(uri string, opts ...OptionFunc) *CURL

声明URL请求结构信息

uri		要请求的网址信息
opts	可选参数,针对此网址进行的配置项追加

func Post deprecated

func Post(uri string, param, header map[string]string) *CURL

Post请求

uri		请求地址
param	请求参数
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func PostJson deprecated

func PostJson(url string, param map[string]any, header map[string]string) *CURL

POST-JSON请求

url		请求地址
param	请求参数【如果不想封装外层map的话,可直接传入map[string]any{"_":xxx}(会在map最外层有且仅有_下标时才会直接取其内容进行传输)】
header	请求头,自动追加accept、Content-Type等属性

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

func (*CURL) AddFile added in v0.2.70

func (c *CURL) AddFile(form_name, file_path string) *CURL

添加待上传的文件

form_name	form表单名
file_path	文件原始路径

func (*CURL) Authorization added in v0.2.39

func (c *CURL) Authorization(token string) *CURL

追加Header请求头信息

token	JWT编码的Token加密信息

func (*CURL) Cookie added in v0.2.39

func (c *CURL) Cookie() []*http.Cookie

获取域名下的cookie信息 如果使用了jar进行cookie管理,会直接返回jar中该域名下的cookie 如果未使用jar进行管理,则会获取CookieQuest的值,然后使用;=进行分割,以提取其中的key/value值 响应的,如果未使用jar进行管理,此处会手动循环cookie中的值进行strings切分,所以此处速度会稍慢一些

func (*CURL) Download added in v0.2.39

func (c *CURL) Download(file string) *CURL

下载文件,将请求的内容保存到本地

file	保存文件名

func (*CURL) DownloadIO added in v0.2.39

func (c *CURL) DownloadIO(f io.Writer) *CURL

下载文件到对外IO中进行重定向

f	写入对象的IO方法

func (*CURL) Get added in v0.2.39

func (c *CURL) Get() *CURL

使用GET请求 此处仅能使用 `Param` 进行设置请求参数

func (*CURL) Header

func (c *CURL) Header(h map[string]string) *CURL

设置Header请求头

h	header请求头的键值对信息

func (*CURL) HeaderKV added in v0.2.39

func (c *CURL) HeaderKV(k, v string) *CURL

设置Header请求头

k	header下标
v	header下标对应的值

func (*CURL) Json

func (curl *CURL) Json(obj any, first ...string) error

获取JSON中的数据

obj			要获取的obj对象,需要提供给json.Unmarshal
first...	simplejson.GetPath传入的string列表

func (*CURL) JsonData

func (curl *CURL) JsonData(obj any) error

获取JSON中的Data对象

obj	要转化的对象,需要在json中的data里面

func (*CURL) Param

func (c *CURL) Param(m map[string]string) *CURL

追加请求参数

m	待追加的参数信息

func (*CURL) ParamJson

func (c *CURL) ParamJson(m map[string]any) *CURL

JSON格式的请求参数追加

m	追加的参数列表(可直接传入map[string]any{"_":xxx}(会在map最外层有且仅有_下标时才会直接取其内容进行传输))

func (*CURL) ParamJsonAny added in v0.2.39

func (c *CURL) ParamJsonAny(m any) *CURL

JSON格式的请求参数追加

m	追加的参数列表(此处为简写map[string]any{"_":any}的写法)

func (*CURL) ParamKV added in v0.2.39

func (c *CURL) ParamKV(k, v string) *CURL

追加请求参数

k	请求参数的参数名
v	请求参数的参数值

func (*CURL) Post added in v0.2.39

func (c *CURL) Post() *CURL

使用POST请求 此处仅能使用 `Param` 进行设置请求参数

func (*CURL) PostJson added in v0.2.39

func (c *CURL) PostJson() *CURL

使用POST请求 此处使用 `ParamJson` 进行设置请求参数,支持使用 `Param` 设置的参数列表

func (*CURL) Replace added in v0.2.92

func (curl *CURL) Replace(old, new string) *CURL

返回值中的字符串替换 此功能会替换 body 内容,请在 GET / POST 之后再行替换

old	待替换内容
new	替换成

func (*CURL) WithOption added in v0.2.39

func (c *CURL) WithOption(opts ...OptionFunc) *CURL

设置Option选项[此参数需要在Get/Post/PostJson之前进行调用,若在之后调用的话会失去作用]

opts	可选参数,针对此网址进行的配置项追加

type CacheInterface added in v0.2.39

type CacheInterface interface {
	Get(name string) string                       // 获取缓存值,缓存未找到的话请返回空字符串
	Set(name string, val string, t time.Duration) // 设置缓存值,可能存在部分无法在string中正常显示的字符串
}

缓存钩子

type Config deprecated added in v0.0.19

type Config struct {
	LogsFunc       func(c *CURL) // 日志记录函数【其param和param_json可能为截取后的结果,但返回值body为完整返回值】
	Https          bool          // 是否跳过HTTPS证书效验
	TimeOut        time.Duration // 请求超时时间
	MaxParamLength int           // 最大参数长度【超过该长度的字符串将会进行截取`MaxParamLength - 3 + "..."`】(直接传入PostJson(_:xxx)的方法无法进行截取)
	NoBodyRouter   []string      // 不记录Body返回值的网址请求,不支持正则表达式,支持开头匹配
	NoHeaderKeys   []string      // 不需要记录的Header信息[不区分大小写]
}

配置请求信息

Deprecated: 该函数在v0.2.31以后版本即将进行弃用,在v0.3.x版本中彻底移除

type GatwayInterface

type GatwayInterface interface {
	// 超时时间
	Timeout() time.Duration

	// 长连接超时时间
	KeepAlive() time.Duration

	// TLS握手超时时间
	TLSHandshakeTimeout() time.Duration

	// 负载均衡的URL列表[此处采用随机的方式进行请求访问]
	Urls() []string

	// 请求的网址信息[可做额外处理,如追加header参数等](此处不建议重写URL)
	// 追加Header方法:request.Header.Set("","")
	QuestUrl(request *http.Request)

	// 响应处理[可做额外处理,如重写返回信息等](socket长连接不支持此方法)
	// 重写方法:将重写结果作为[]byte进行返回(若此值为nul则表示不进行重写)
	ResponseUrl(response *http.Response) ([]byte, error)

	// 错误处理方法
	// 错误回调 :关闭real_server时测试,错误回调
	// 范围:transport.RoundTrip发生的错误、以及ModifyResponse发生的错误
	Error(w http.ResponseWriter, r *http.Request, err error)
}

传入的接口信息,用于处理响应的回调操作

type Option added in v0.2.39

type Option struct {
	// contains filtered or unexported fields
}

外部选项传参结构[可选参数]

type OptionFunc added in v0.2.39

type OptionFunc func(c *Option)

选项设置参数,用于设置本次请求中的选项信息

func WithCache added in v0.2.39

func WithCache(t time.Duration) OptionFunc

设置缓存时间

t	设置缓存时间,0表示不设置缓存

func WithContext added in v0.2.94

func WithContext(ctx context.Context) OptionFunc

使用context.Context来控制进程请求

ctx	控制请求的context结构

func WithCookie added in v0.2.41

func WithCookie(jar *cookiejar.Jar) OptionFunc

使用不同的cookiejar包

jar	存储cookie的依赖结构[传入nil表示不存储cookie]

func WithDisableHttpV2 added in v0.2.95

func WithDisableHttpV2() OptionFunc

禁用http2协议

func WithHosts added in v0.2.94

func WithHosts(host map[string]string) OptionFunc

导入程序指定的host对(此处的域名、IP对应关系和host文件中的对应关系) 如果host中写入端口的话,域名和IP都需要对应上端口才行,如:"xiaoyutab.cn:443": "120.24.39.208:443"

host	待导入的主机对,格式为   "域名[:端口]": "主机IP[:端口]"

func WithHttpsContinue added in v0.2.39

func WithHttpsContinue() OptionFunc

设置跳过https证书验证

func WithIgnoreHeader added in v0.2.39

func WithIgnoreHeader(k string) OptionFunc

设置忽略header头日志

k	header请求头的下标标识

func WithNoLog added in v0.2.39

func WithNoLog() OptionFunc

设置此记录不记录日志标识

func WithRetry added in v0.2.94

func WithRetry(uri, cnt string) OptionFunc

设置是否启用重试机制 此操作会在请求失败时自动重试,重试次数暂为指定的11次,即共请求12次结果 重试间隔:1s、2s、5s、10s、20s、30s、1min、3min、5min、10min、30min 重试报告不会记录请求日志,也不会使用重试机制,即报告一旦接收失败,则此次报告不会再次重传 报告提交: - 成功请求:curl -I -X POST -H "Content-Type: application/json" -d '{"msg": "SUCCESS","report": ["返回的Body内容"]}' <URI> - 失败请求:curl -I -X POST -H "Content-Type: application/json" -d '{"msg": "FAILED", "report": ["网络请求Code返回错误:500"]}' <URI> - 失败+成功请求:curl -I -X POST -H "Content-Type: application/json" -d '{"msg": "ATTEMPTED SUCCESS", "report": ["网络请求Code返回错误:500","返回的Body内容"]}' <URI>

uri	报告URI地址(空则表示不提交错误报告)
cnt	成功的返回内容(空表示只验证http-code在200~299之间,非空则额外验证返回内容包含此内容)

func WithTimeOut added in v0.2.39

func WithTimeOut(t time.Duration) OptionFunc

设置请求的超时时间

t	设置超时时间

type WGroup added in v0.2.55

type WGroup struct {
	HasTimeOut bool    // 是否是超时操作
	Error      []error // 错误信息(只有在AddError以后才能判断此值,否则此值会一直为nil)
	// contains filtered or unexported fields
}

分组请求结构 每个请求组只可运行一次

func Group added in v0.2.55

func Group(fun ...func()) *WGroup

HTTP请求组,将一组HTTP请求放置在一起,进行并发请求,直到最后一个请求完成再往下进行处理 该程序的耗时与传入的具体函数有关,一般情况下比传入的程序的最大耗时再大一些 该方法用于实现比 sync.WaitGroup 更精细的功能,效率比 sync.WaitGroup 稍低

fun	待处理的函数请求

func (*WGroup) Add added in v0.2.55

func (g *WGroup) Add(fun ...func()) *WGroup

添加异步待处理请求

fun	待处理的函数请求

func (*WGroup) AddError added in v0.2.92

func (g *WGroup) AddError(f func() error) *WGroup

添加可以返回错误信息的函数调用

f	带有error返回值的错误信息

func (*WGroup) Run added in v0.2.55

func (g *WGroup) Run() *WGroup

开始执行

func (*WGroup) Times added in v0.2.55

func (g *WGroup) Times() time.Duration

获取请求组运行时间

func (*WGroup) WithContext added in v0.2.92

func (g *WGroup) WithContext(ctx context.Context) *WGroup

设置中控context结构

ctx	中控结构

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL