MCPcopy
hub / github.com/coder/websocket / accept

Function accept

accept.go:106–182  ·  view source on GitHub ↗
(w http.ResponseWriter, r *http.Request, opts *AcceptOptions)

Source from the content-addressed store, hash-verified

104}
105
106func accept(w http.ResponseWriter, r *http.Request, opts *AcceptOptions) (_ *Conn, err error) {
107 defer errd.Wrap(&err, "failed to accept WebSocket connection")
108
109 errCode, err := verifyClientRequest(w, r)
110 if err != nil {
111 http.Error(w, err.Error(), errCode)
112 return nil, err
113 }
114
115 opts = opts.cloneWithDefaults()
116 if !opts.InsecureSkipVerify {
117 err = authenticateOrigin(r, opts.OriginPatterns)
118 if err != nil {
119 if errors.Is(err, path.ErrBadPattern) {
120 log.Printf("websocket: %v", err)
121 err = errors.New(http.StatusText(http.StatusForbidden))
122 }
123 http.Error(w, err.Error(), http.StatusForbidden)
124 return nil, err
125 }
126 }
127
128 hj, ok := hijacker(w)
129 if !ok {
130 err = errors.New("http.ResponseWriter does not implement http.Hijacker")
131 http.Error(w, http.StatusText(http.StatusNotImplemented), http.StatusNotImplemented)
132 return nil, err
133 }
134
135 w.Header().Set("Upgrade", "websocket")
136 w.Header().Set("Connection", "Upgrade")
137
138 key := r.Header.Get("Sec-WebSocket-Key")
139 w.Header().Set("Sec-WebSocket-Accept", secWebSocketAccept(key))
140
141 subproto := selectSubprotocol(r, opts.Subprotocols)
142 if subproto != "" {
143 w.Header().Set("Sec-WebSocket-Protocol", subproto)
144 }
145
146 copts, ok := selectDeflate(websocketExtensions(r.Header), opts.CompressionMode)
147 if ok {
148 w.Header().Set("Sec-WebSocket-Extensions", copts.String())
149 }
150
151 w.WriteHeader(http.StatusSwitchingProtocols)
152 // See https://github.com/nhooyr/websocket/issues/166
153 if ginWriter, ok := w.(interface {
154 WriteHeaderNow()
155 }); ok {
156 ginWriter.WriteHeaderNow()
157 }
158
159 netConn, brw, err := hj.Hijack()
160 if err != nil {
161 err = fmt.Errorf("failed to hijack connection: %w", err)
162 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
163 return nil, err

Callers 1

AcceptFunction · 0.85

Calls 13

WrapFunction · 0.92
verifyClientRequestFunction · 0.85
authenticateOriginFunction · 0.85
hijackerFunction · 0.85
secWebSocketAcceptFunction · 0.85
selectSubprotocolFunction · 0.85
selectDeflateFunction · 0.85
websocketExtensionsFunction · 0.85
newConnFunction · 0.85
ErrorMethod · 0.45
cloneWithDefaultsMethod · 0.45
StringMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…