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

Method writeFrame

write.go:288–373  ·  view source on GitHub ↗

writeFrame handles all writes to the connection.

(ctx context.Context, fin bool, flate bool, opcode opcode, p []byte)

Source from the content-addressed store, hash-verified

286
287// writeFrame handles all writes to the connection.
288func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opcode, p []byte) (_ int, err error) {
289 err = c.writeFrameMu.lock(ctx)
290 if err != nil {
291 return 0, err
292 }
293 defer c.writeFrameMu.unlock()
294
295 defer func() {
296 if c.isClosed() && opcode == opClose {
297 err = nil
298 }
299 if err != nil {
300 if ctx.Err() != nil {
301 err = ctx.Err()
302 } else if c.isClosed() {
303 err = net.ErrClosed
304 }
305 err = fmt.Errorf("failed to write frame: %w", err)
306 }
307 }()
308
309 c.closeStateMu.Lock()
310 closeSentErr := c.closeSentErr
311 c.closeStateMu.Unlock()
312 if closeSentErr != nil {
313 return 0, net.ErrClosed
314 }
315
316 select {
317 case <-c.closed:
318 return 0, net.ErrClosed
319 default:
320 }
321 if c.setupWriteTimeout(ctx) {
322 defer c.clearWriteTimeout()
323 }
324
325 c.writeHeader.fin = fin
326 c.writeHeader.opcode = opcode
327 c.writeHeader.payloadLength = int64(len(p))
328
329 if c.client {
330 c.writeHeader.masked = true
331 _, err = io.ReadFull(rand.Reader, c.writeHeaderBuf[:4])
332 if err != nil {
333 return 0, fmt.Errorf("failed to generate masking key: %w", err)
334 }
335 c.writeHeader.maskKey = binary.LittleEndian.Uint32(c.writeHeaderBuf[:])
336 }
337
338 c.writeHeader.rsv1 = false
339 if flate && (opcode == opText || opcode == opBinary) {
340 c.writeHeader.rsv1 = true
341 }
342
343 err = writeFrameHeader(c.writeHeader, c.bw, c.writeHeaderBuf[:])
344 if err != nil {
345 return 0, err

Callers 5

writeMethod · 0.95
writeControlMethod · 0.95
writeCompressedFrameMethod · 0.80
writeMethod · 0.80
CloseMethod · 0.80

Calls 10

isClosedMethod · 0.95
setupWriteTimeoutMethod · 0.95
clearWriteTimeoutMethod · 0.95
writeFramePayloadMethod · 0.95
casClosingMethod · 0.95
closeMethod · 0.95
writeFrameHeaderFunction · 0.85
lockMethod · 0.80
unlockMethod · 0.45
LockMethod · 0.45

Tested by

no test coverage detected