handleControl handles Control request Params: - d: length of the control message Returns: - error
(d byte, l log.Logger)
| 148 | // Returns: |
| 149 | // - error |
| 150 | func (e *Handler) handleControl(d byte, l log.Logger) error { |
| 151 | buf := e.rBuf[1:] |
| 152 | |
| 153 | if len(buf) < int(d) { |
| 154 | return ErrHandlerControlMessageTooLong |
| 155 | } |
| 156 | |
| 157 | rLen, rErr := io.ReadFull(&e.receiver, buf[:d]) |
| 158 | |
| 159 | if rErr != nil { |
| 160 | return rErr |
| 161 | } |
| 162 | |
| 163 | if rLen <= 0 { |
| 164 | return ErrHandlerInvalidControlMessage |
| 165 | } |
| 166 | |
| 167 | switch buf[0] { |
| 168 | case HeaderControlEcho: |
| 169 | hd := HeaderControl |
| 170 | hd.Set(d) |
| 171 | |
| 172 | e.rBuf[0] = byte(hd) |
| 173 | e.rBuf[1] = HeaderControlEcho |
| 174 | |
| 175 | var wErr error |
| 176 | |
| 177 | if !e.senderPaused { |
| 178 | _, wErr = e.sender.Write(e.rBuf[:rLen+1]) |
| 179 | } else { |
| 180 | _, wErr = e.sender.writer.Write(e.rBuf[:rLen+1]) |
| 181 | } |
| 182 | |
| 183 | return wErr |
| 184 | |
| 185 | case HeaderControlPauseStream: |
| 186 | if !e.senderPaused { |
| 187 | e.sender.lock.Lock() |
| 188 | e.senderPaused = true |
| 189 | } |
| 190 | |
| 191 | case HeaderControlResumeStream: |
| 192 | if e.senderPaused { |
| 193 | e.sender.lock.Unlock() |
| 194 | e.senderPaused = false |
| 195 | } |
| 196 | } |
| 197 | |
| 198 | return nil |
| 199 | } |
| 200 | |
| 201 | // handleStream handles streams |
| 202 | // |