Receive receives a message from the frontend. The returned message is only valid until the next call to Receive.
()
| 168 | |
| 169 | // Receive receives a message from the frontend. The returned message is only valid until the next call to Receive. |
| 170 | func (b *Backend) Receive() (FrontendMessage, error) { |
| 171 | if !b.partialMsg { |
| 172 | header, err := b.cr.Next(5) |
| 173 | if err != nil { |
| 174 | return nil, translateEOFtoErrUnexpectedEOF(err) |
| 175 | } |
| 176 | |
| 177 | b.msgType = header[0] |
| 178 | |
| 179 | msgLength := int(int32(binary.BigEndian.Uint32(header[1:]))) |
| 180 | if msgLength < 4 { |
| 181 | return nil, fmt.Errorf("invalid message length: %d", msgLength) |
| 182 | } |
| 183 | |
| 184 | b.bodyLen = msgLength - 4 |
| 185 | if b.maxBodyLen > 0 && b.bodyLen > b.maxBodyLen { |
| 186 | return nil, &ExceededMaxBodyLenErr{b.maxBodyLen, b.bodyLen} |
| 187 | } |
| 188 | b.partialMsg = true |
| 189 | } |
| 190 | |
| 191 | var msg FrontendMessage |
| 192 | switch b.msgType { |
| 193 | case 'B': |
| 194 | msg = &b.bind |
| 195 | case 'C': |
| 196 | msg = &b._close |
| 197 | case 'D': |
| 198 | msg = &b.describe |
| 199 | case 'E': |
| 200 | msg = &b.execute |
| 201 | case 'F': |
| 202 | msg = &b.functionCall |
| 203 | case 'f': |
| 204 | msg = &b.copyFail |
| 205 | case 'd': |
| 206 | msg = &b.copyData |
| 207 | case 'c': |
| 208 | msg = &b.copyDone |
| 209 | case 'H': |
| 210 | msg = &b.flush |
| 211 | case 'P': |
| 212 | msg = &b.parse |
| 213 | case 'p': |
| 214 | switch b.authType { |
| 215 | case AuthTypeSASL: |
| 216 | msg = &SASLInitialResponse{} |
| 217 | case AuthTypeSASLContinue: |
| 218 | msg = &SASLResponse{} |
| 219 | case AuthTypeSASLFinal: |
| 220 | msg = &SASLResponse{} |
| 221 | case AuthTypeGSS, AuthTypeGSSCont: |
| 222 | msg = &GSSResponse{} |
| 223 | case AuthTypeCleartextPassword, AuthTypeMD5Password: |
| 224 | fallthrough |
| 225 | default: |
| 226 | // to maintain backwards compatibility |
| 227 | msg = &PasswordMessage{} |