(src: &mut BytesMut)
| 75 | } |
| 76 | |
| 77 | fn decode_startup_message(src: &mut BytesMut) -> io::Result<Option<FrontendMessage>> { |
| 78 | if src.len() < 4 { |
| 79 | return Ok(None); |
| 80 | } |
| 81 | |
| 82 | let len = (&src[0..4]).get_i32() as usize; |
| 83 | |
| 84 | if src.len() < len { |
| 85 | return Ok(None); |
| 86 | } |
| 87 | |
| 88 | let msg_bytes = src.split_to(len); |
| 89 | let mut msg_buf = &msg_bytes[4..]; // Skip length |
| 90 | |
| 91 | let protocol_version = msg_buf.get_i32(); |
| 92 | |
| 93 | // Check for SSL request (protocol version 80877103) |
| 94 | if protocol_version == 80877103 { |
| 95 | return Ok(Some(FrontendMessage::SslRequest)); |
| 96 | } |
| 97 | |
| 98 | let mut parameters = HashMap::new(); |
| 99 | |
| 100 | // Read parameter pairs until we hit null terminator |
| 101 | while msg_buf.has_remaining() && msg_buf[0] != 0 { |
| 102 | let key = read_cstring(&mut msg_buf)?; |
| 103 | let value = read_cstring(&mut msg_buf)?; |
| 104 | parameters.insert(key, value); |
| 105 | } |
| 106 | |
| 107 | Ok(Some(FrontendMessage::StartupMessage(StartupMessage { |
| 108 | protocol_version, |
| 109 | parameters, |
| 110 | }))) |
| 111 | } |
| 112 | |
| 113 | fn decode_normal_message(src: &mut BytesMut) -> io::Result<Option<FrontendMessage>> { |
| 114 | if src.len() < 5 { |
no test coverage detected