MCPcopy Index your code
hub / github.com/GoEdgeLab/EdgeNode / doWebsocket

Method doWebsocket

internal/nodes/http_request_websocket.go:39–205  ·  view source on GitHub ↗

处理Websocket请求

(requestHost string, isLastRetry bool)

Source from the content-addressed store, hash-verified

37
38// 处理Websocket请求
39func (this *HTTPRequest) doWebsocket(requestHost string, isLastRetry bool) (shouldRetry bool) {
40 // 设置不缓存
41 this.web.Cache = nil
42
43 if this.web.WebsocketRef == nil || !this.web.WebsocketRef.IsOn || this.web.Websocket == nil || !this.web.Websocket.IsOn {
44 this.writer.WriteHeader(http.StatusForbidden)
45 this.addError(errors.New("websocket have not been enabled yet"))
46 return
47 }
48
49 // TODO 实现handshakeTimeout
50
51 // 校验来源
52 var requestOrigin = this.RawReq.Header.Get("Origin")
53 if len(requestOrigin) > 0 {
54 u, err := url.Parse(requestOrigin)
55 if err == nil {
56 if !this.web.Websocket.MatchOrigin(u.Host) {
57 this.writer.WriteHeader(http.StatusForbidden)
58 this.addError(errors.New("websocket origin '" + requestOrigin + "' not been allowed"))
59 return
60 }
61 }
62 }
63
64 // 标记
65 this.isWebsocketResponse = true
66
67 // 设置指定的来源域
68 if !this.web.Websocket.RequestSameOrigin && len(this.web.Websocket.RequestOrigin) > 0 {
69 var newRequestOrigin = this.web.Websocket.RequestOrigin
70 if this.web.Websocket.RequestOriginHasVariables() {
71 newRequestOrigin = this.Format(newRequestOrigin)
72 }
73 this.RawReq.Header.Set("Origin", newRequestOrigin)
74 }
75
76 // 获取当前连接
77 var requestConn = this.RawReq.Context().Value(HTTPConnContextKey)
78 if requestConn == nil {
79 return
80 }
81
82 // 连接源站
83 originConn, _, err := OriginConnect(this.origin, this.requestServerPort(), this.RawReq.RemoteAddr, requestHost)
84 if err != nil {
85 if isLastRetry {
86 this.write50x(err, http.StatusBadGateway, "Failed to connect origin site", "源站连接失败", false)
87 }
88
89 // 增加失败次数
90 SharedOriginStateManager.Fail(this.origin, requestHost, this.reverseProxy, func() {
91 this.reverseProxy.ResetScheduling()
92 })
93
94 shouldRetry = true
95 return
96 }

Callers 1

doOriginRequestMethod · 0.95

Calls 15

addErrorMethod · 0.95
FormatMethod · 0.95
requestServerPortMethod · 0.95
write50xMethod · 0.95
OriginConnectFunction · 0.85
ParseMethod · 0.80
ContextMethod · 0.80
FailMethod · 0.80
SuccessMethod · 0.80
WriteHeaderMethod · 0.65

Tested by

no test coverage detected