我有一个网络服务器,它发出ETag
响应的If-None-Match
标头并检查来自客户端的标头(如果存在)。在这种情况下,客户端不是 Web 浏览器,而是 go 内置net/http
http.Client
类型的扩展。
这是我的代码
package util
import "net/http"
import "net/url"
type HttpClient struct {
http.Client
etags map[url.URL]string
}
func (hc *HttpClient) Do(req *http.Request) (*http.Response, error) {
const ETAG_SERVER_HEADER = "ETag"
const ETAG_CLIENT_HEADER = "If-None-Match"
//Do not attempt to use ETags on non-GET requests
if req.Method != "GET" {
return hc.Client.Do(req)
}
//Check for an existing etag
etag, ok := hc.etags[*req.URL]
if ok { //If an ETag is present, send it along …
Run Code Online (Sandbox Code Playgroud) 如果我运行此代码:
for x in range(10):
time.sleep(1)
print("a")
Run Code Online (Sandbox Code Playgroud)
它会做到它应该做的事情.但如果我运行这个:
for x in range(10):
time.sleep(1)
print("a", end="")
Run Code Online (Sandbox Code Playgroud)
它会等待整整10秒,然后打印10 a
秒.
我怎么能阻止这个?
我正在查看编译后编写的一些代码的生成程序集avr-gcc
。具体来说,我是用-Os
选项编译的。总的来说,输出是我所期望的,但我无法理解的是push r1
正在发出的指令。更奇怪的是,函数末尾的补充指令是pop r0
. 所以 的值r1
正在被保存但它似乎被恢复到r0
根据此处的文档:
https://gcc.gnu.org/wiki/avr-gcc#Register_Layout
寄存器r1
始终包含零,但函数可以在恢复寄存器时使用该寄存器。恢复它将是ldi r1, 0x0
,不需要推动,从我的理解中弹出。
下面是编译版本的 C 代码和反汇编示例。它是用-Os
. 它有点长,但我必须制作一个大函数才能让编译器发出它。
代码:
void mqtt_create_connect(mqtt_parser *p, mqtt_connect_config *cfg){
uint8_t idx = 0;
p->buffer[idx++] = MQTT_CTRL_CONNECT << 4;
idx++; // skip remaining length for now
p->buffer[idx++] = 0x0;
p->buffer[idx++] = 0x4;
p->buffer[idx++] = 'M';
p->buffer[idx++] = 'Q';
p->buffer[idx++] = 'T';
p->buffer[idx++] = 'T';
p->buffer[idx++] = 0x04; // protocol level 3.1.1
p->buffer[idx++] = …
Run Code Online (Sandbox Code Playgroud)