| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package l7
- import (
- "bytes"
- "strconv"
- "strings"
- )
- func ParseHttp(payload []byte) (string, string) {
- method, rest, ok := bytes.Cut(payload, space)
- if !ok {
- return "", ""
- }
- if !isHttpMethod(string(method)) {
- return "", ""
- }
- uri, _, ok := bytes.Cut(rest, space)
- if !ok {
- uri = append(uri, []byte("...")...)
- }
- return string(method), string(uri)
- }
- func ParseHttpHost(payload []byte, isTls bool) (string, string, string, uint16) {
- method, rest, ok := bytes.Cut(payload, space)
- if !ok {
- return "", "", "", 0
- }
- if !isHttpMethod(string(method)) {
- return "", "", "", 0
- }
- uri, rest, ok := bytes.Cut(rest, space)
- if !ok {
- uri = append(uri, []byte("...")...)
- }
- //hostStart := bytes.Index(rest, []byte("Host:")) + len("Host:")
- hostHeader := "Host:"
- hostIdx := bytes.Index(rest, []byte(hostHeader))
- if hostIdx == -1 {
- return string(method), string(uri), "", 0
- }
- hostStart := hostIdx + len(hostHeader)
- hostEnd := bytes.Index(rest[hostStart:], []byte("\r\n"))
- var hostPortBts []byte
- if hostEnd == -1 {
- hostPortBts = rest[hostStart:]
- } else {
- hostPortBts = rest[hostStart : hostStart+hostEnd]
- }
- hostPort := string(bytes.TrimSpace(hostPortBts))
- hostParts := strings.Split(hostPort, ":")
- host := hostParts[0]
- // 根据 TLS 标识设置默认端口
- var port uint16
- if isTls {
- port = 443 // HTTPS 默认端口
- } else {
- port = 80 // HTTP 默认端口
- }
- // 如果 Host 头部明确指定了端口,使用指定的端口
- if len(hostParts) > 1 {
- port64, err := strconv.ParseUint(hostParts[1], 10, 16)
- if err == nil {
- port = uint16(port64)
- }
- }
- return string(method), string(uri), host, port
- }
|