以后会开一个板块,摸鱼快报,快速记录这几周开发中雕虫小技, 也算一个错题集。

1. 向开发环境localhost:3000种植cookie

前端使用Create React App脚手架,默认以localhost:3000端口启动;
后端使用golang-gin框架,使用8034端口启动。
登录模块走的是sso,前后端分离,后端需要向前端写入认证cookie

c.SetSameSite(http.SameSiteLaxMode)
c.SetCookie("userInfo", userInfoMapString, 60*60*12, "/", cfg.CookieDomain, false, false)
c.SetCookie("access_token", accessToken.(string), 60*60*12, "/", cfg.CookieDomain, false, false)

若种植cookie时设置domain=localhost:3000,实际会发现该cookie被种为domain=localhost

① golang给出日志提示:2023/01/12 19:10:48 net/http: invalid Cookie.Domain "localhost:3000"; dropping domain attribute, 该cookie domain属性被丢弃:

② 浏览器认定该cookie没有domain,dimain属性值被重置当前页面domain,该Cookie为HostOnly Cookie,后续请求只有host与cookie的domain完全相等,才能携带这个cookie。

react配置后端地址,要配置为 localhost:8034,而不能是 127.0.0.1:8034

经此一役:

  • • 源(Origin)是由 URL 中协议、主机名(域名 domain)以及端口共同组成的部分

  • • 本次出现的问题在于两个关键cookie属性 :

    • • cookie domain:cookie被种植到哪个域名下?

    • • cookie samesite:请求时,哪些资源能携带该cookie?

2. httpclient timeout报错经验

golang net/http httpclientTimeout:
Timeout specifies a time limit for requests made by this Client. The timeout includes connection time, any redirects, and reading the response body. The timer remains running after Get, Head, Post, or Do return and will interrupt reading of the Response.Body.

HttpClient Timeout包括连接、重定向(如果有)、从Response Body读取的时间,内置定时器会在Get,Head、Post、Do 方法之后继续运行,并有能力中断读取Response.Body.

如果upstream服务器处理超时(upstream_response_time> client设置的timeout),则会返回context deadline exceeded (Client.Timeout exceeded while awaiting headers)

如果客户端使用io.ReadAll读取body超时,则会返回context deadline exceeded (Client.Timeout or context cancellation while reading body)

3. url 大小写敏感

大家使用net/http 建立的http server,默认的请求url path是大小写敏感的:

s.mux.HandleFunc("/leader", func(w http.ResponseWriter, r *http.Request) {}s.mux.HandleFunc("/LEADER", func(w http.ResponseWriter, r *http.Request) {}

以上会被认定为不同的路由path。
探究源码:ServeMux使用map[string]muxEntry 哈希表来存储路由。


这与aspnet core的路由行为是不一样的,/hello、/HELLO都会命中下面的路由。

app.UseEndpoints(endpoints =>{  endpoints.MapGet("/hello", async context =>{await context.Response.WriteAsync("Hello!");});
}

w3c官方建议:url大小写敏感

URLs in general are case-sensitive (with the exception of machine names). There may be URLs, or parts of URLs, where case doesn't matter, but identifying these may not be easy. Users should always consider that URLs are case-sensitive。
大意是说:除了domain主机名是大小写不敏感,url一般被认为是大小写敏感。

stackoverflow有更清晰的描述:

The scheme and host are case-insensitive and normally provided in lowercase; all other components are compared in a case-sensitive manner.

4. golang statuscode被作为header,一直很费解。

在 Go 语言中,客户端请求信息都封装到了Request对象,但是发送给客户端的响应并不是 Response 对象,而是ResponseWriter

func Home(w http.ResponseWriter, r *http.Request)  {io.WriteString(w, "Welcome to my blog site")
}

ResponseWriter是处理器用来创建 HTTP 响应的接口,其源码结构如下所示:

type ResponseWriter interface {// 用于设置/获取所有响应头信息Header() Header// 用于写入数据到响应实体Write([]byte) (int, error)// 用于设置响应状态码WriteHeader(statusCode int)
}

WriteHeader这个方法名有点误导,其实它并不是用来设置响应头的,该方法支持传入一个整型数据用来表示响应状态码,如果不调用该方法的话,默认响应状态码是 200 OK。

在fasthttp中,设置请求谓词:req.Header.SetMethod("POST"), 这种将谓词作为header的行为,我也是服气。

只能设置一次statuscode, 若多次设置statuscode,以前者优先。

例如尝试以如下方式:

http.NotFound(w, r)   # 会调用WriteHeader(404);Write()写入body
w.WriteHeader(http.StatusInternalServerError)

会产生一个告警:2023/01/06 19:19:43 http: superfluous response.WriteHeader call from main.ProxyHandler (proxy.go:25), 同时产生404状态码。

可以采用如下方式清晰定义状态码和body

w.WriteHeader(http.StatusInternalServerError)
fmt.Fprintln(w, "404 page not found")

本周摸鱼快报,如有更新,请关注左下角[阅读原文]地址。

阅读时间3min;   难度星: 3(满星5星);价值度: 3(满分5分)。

点“”戳“在看

体现态度很有必要!

摸鱼快报:golang net/http中的雕虫小技相关推荐

  1. python摸鱼之掩藏在泥土中的鱼,领导都在夸你勤奋

    1.时常感慨自己的项目做的太快,经常无事可做,烦恼的一批 2.于是,准备摸鱼 3.如何摸鱼,怎么摸鱼,这是烦恼的一件事情 4.看到各路python作者说看小说打发无聊的时光,没错,好想法 5.于是开始 ...

  2. 摸鱼神器——python命令行小说阅读器实现

    文章目录 一.摸鱼思路 二.阅读器实现思路 三.实现 1.拆分章节 2.翻页 3.阅读主逻辑 4.完整代码 四.效果展示 & 源码(测试数据--诡秘之主)获取 一.摸鱼思路 在命令行中进行小说 ...

  3. 上班摸鱼,刚刚发现在 VScode 中可玩魂斗罗,超级玛丽

    今天,再给大家介绍一款更加有意思的vscode插件--"小霸王". GitHub传送门:https://github.com/gamedilong/anes-repository ...

  4. 摸鱼也要讲究方法:工作学习中玩手机并不能缓解无聊和疲劳

    撰文 | 王聪 编辑 | nagashi 排版 | 水成文 智能手机的出现,对社会产生了深远的影响,人们不仅可以用智能手机来拨打电话或发送短信,还用于处理各种应用程序.当代社会,手机早已成为人们生活. ...

  5. idea中摸鱼插件_推荐几款我常用的IDEA插件~网友:妈耶~飞起来咯!

    哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号加星标置顶,在此真诚的表示感谢~ 正文如下: 从事开发工作的读者们肯定都知道'IDE ...

  6. idea中摸鱼插件_上班防摸鱼插件(知乎页面)

    前言 最近突发奇想,写了一个js插件,用来防止上班摸鱼,插件仅知乎页面有效,别做的太绝... 启动该插件后,打开知乎页面,标题会改成 "摸鱼中..." ,背景被替换成咸鱼.每隔一分 ...

  7. 潜伏在大厂中“摸鱼”的打工人

    本文转载自 首席人物观,作者 克瑞斯 早九晚九加单休已经成为国内一批互联网打工人的身份标签,它意味着奋斗,也凸显出压榨. 早在2019年,就曝光了国内强制实行该工作制的互联网企业,当红大厂几乎悉数在列 ...

  8. idea中摸鱼插件_IDEA 看书摸鱼插件,时隔一年,再次更新

    1340976576:项目地址: https://github.com/yisier/thief-book-idea 之前看到有网友开发了一款 PC 端和 VS Code 插件版的小说阅读器(摸鱼神器 ...

  9. 摸鱼神器:在命令行中玩斗地主

    斗地主我想大家都会玩吧,但是不知道大家有没有在命令行内玩过斗地主.这个项目是基于 Netty 实现的一款命令行斗地主游戏,在下班后或者工作闲暇之余,你都可以肆无忌惮的在命令行中玩斗地主. 逛逛常用的摸 ...

最新文章

  1. python自动化运维开发-Python自动化运维开发----基础(七)元组
  2. 配置nginx下别名alias支持PHP fastcgi解析
  3. 线程池的使用(线程池重点解析)
  4. JDK 8 BigInteger精确缩小转换方法
  5. Linux内核源码目录说明
  6. 03-04 元素定位工具
  7. 设计社交网络的数据结构
  8. 旷视科技提出双向网络BiSeNet:实现实时语义分割
  9. 变分自编码器(VAE)详解与实现(tensorflow2.x)
  10. 有趣有用的PCA——PCA压缩图片
  11. 平面设计完全手册_什么是平面设计,做平面设计都要了解哪些基础知识点?
  12. 35岁的程序员:第12章,林菲菲
  13. Greenplum数据库配置管理-参数配置管理和常用参数优化建议
  14. android 限制后台进程,Android O Preview 相关-后台执行限制
  15. 苹果不更新APP动态更换节假日Logo
  16. 他们竟用后台数据偷窥喜欢的女性!
  17. 模具设计分型的10大原则
  18. 开源邮件客户端_排名前6位的开源桌面电子邮件客户端
  19. Vue响应式原理 vue源码(十一)
  20. 原始传奇显示区名的服务器,《原始传奇》新人新区需要了解的一些问题

热门文章

  1. QQ语音进度条功能怎么用?附qq语音进度条使用方法
  2. 人生信条:不要太乐观,不要太悲观
  3. Windows10安装打开软件提示“为了对电脑进行保护,已经阻止此应用”解决方法!
  4. 为什么吃鸡体验服说当前服务器正在维护,“吃鸡”体验服出现46字提示,先别急卸载,第6张地图即将上线...
  5. vivado 亚稳态_Vivado仿真在某时刻卡住问题
  6. CSP认证 202009-4 星际旅行 Python 题解 思路清晰
  7. 如何用即时工具对制作好的视频进行在线翻转?
  8. 21点游戏简单开发(Python)
  9. hybris学习笔记:New Extension
  10. CD/CD系统之OPEN-C3【简介】