浏览器如何知道读取数据的结束



我正在尝试使用Golang制作https代理。我知道首先,浏览器发送头结束到rn和套接字块read(),直到读取这些字符。但是当它被加密(ssl/tls)和HTTP 1.1(保持连接存活)

  • 浏览器如何知道读取数据的结束?
  • 他们读字节字节和一些特殊字符结束(这是大数据的好方法吗?)?
  • 或者他们先发送数据大小(如建议的主题tcp套接字)?
  • 作为代理,我怎么能理解数据流或加载简单的html页面时结束?

这只是代码的一部分,当我在本地网络中运行它时,它会起作用,但在服务器(vps)中将阻塞读取,直到连接关闭。完整的代码在这里

func write(client_to_proxy net.Conn, browser_to_client net.Conn) {
defer client_to_proxy.Close()
buffer := make([]byte, 1024)
reader := bufio.NewReader(browser_to_client)
for {
length, err := reader.Read(buffer)
if length > 0 {
fmt.Println(time.Now().Format(time.Stamp) + " READ from client to browser: " + strconv.Itoa(length))
//fmt.Println(string(buffer[:readLeng]))
writeLength, err := client_to_proxy.Write(buffer[:length])
if writeLength > 0 {
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
}
if err != nil {
fmt.Println("ERR6 ", err)
return
}
}
if err != nil {
fmt.Println("ERR5 ", err)
return
}
}
}
func read(client_to_proxy net.Conn, browser_to_client net.Conn) {
defer browser_to_client.Close()
buffer := make([]byte, 1024)
reader := bufio.NewReader(client_to_proxy)
length, err := reader.Read(buffer)
fmt.Println(time.Now().Format(time.Stamp) + " READ from proxy to client: " + strconv.Itoa(length))
fmt.Println(string(buffer))
if length > 0 {
writeLength, err := browser_to_client.Write(buffer[:length])
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
if err != nil {
fmt.Println("ERR7 ", err)
return
}
}
if err != nil {
return
}
go write(client_to_proxy, browser_to_client)
for {
length, err := reader.Read(buffer)
fmt.Println(time.Now().Format(time.Stamp) + " READ from proxy to client: " + strconv.Itoa(length))
//fmt.Println(string(buffer[:length]))
if length > 0 {
writeLength, err := browser_to_client.Write(buffer[:length])
fmt.Println(time.Now().Format(time.Stamp) + " WRITE from client to browser: " + strconv.Itoa(writeLength))
if err != nil {
fmt.Println("ERR8 ", err)
return
}
}
if err != nil {
return
}
}
}

编辑1:我使用客户端和服务器端go应用程序,像这样浏览器->client->proxy->so.com然后so.com-> proxy-> client->browser我不要加密数据!我的问题是在"客户端"应用程序,我不知道知道应该读多少字节来解封read()!

浏览器如何知道读取数据结束?

通过实施标准。

对于HTTP/1.1,请参见RFC 7230 3.3消息体长度章节,了解如何确定消息体长度的详细信息。提示:基于HTTP报头信息,如Content-length和Transfer-Encoding。

作为代理,我怎么能理解数据流或加载简单的html页面时结束?

代理的行为与普通HTTP消息相同。

HTTPS流量通过代理使用隧道在客户端和服务器之间进行端到端加密。该隧道通过CONNECT请求创建,该请求仅在TCP连接关闭时结束。代理无法洞察连接,因此也无法确定加密流量中各种请求和响应的HTTP消息头和正文的位置。

最新更新