How to read only the first X bytes of a message using Golang

76 Views Asked by At

Say I have some WS code like so:

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}


func handleConnections(w http.ResponseWriter, r *http.Request) {

    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer ws.Close()

    for {
        messageType, message, err := ws.ReadMessage()
         // above works...
       // I want to read the first 20 bytes, not the whole message
      
    }
}

how an I read the first X bytes, not the whole message?

1

There are 1 best solutions below

3
Cerise Limón On

Use NextReader to get an io.Reader on the message. Read X bytes from the reader.

const X = 20
for {
    messageType, r, err := ws.NextReader()
    if err != nil { 
        // Failure reading message.
        break 
    }
    var buf [X]byte
    n, err := io.ReadFull(r, buf[:])
    if err != nil && err != io.ErrUnexpectedEOF {
       // Failure reading message.
       break
    }   

    // The variable prefix is the first X bytes of
    // message or the entire message if message is
    // shorter than X bytes.
    prefix := buf[:n]
  
    // Do something with prefix. 
}

If you want to handle short messages as an error, then change the error check to:

    if err == io.ErrUnexpectedEOF {
       // Handle short message.
       continue // or break if short message is a hard failure.
    } else if err != nil {
       // Failure reading message
       break
    }