fixed class and method index

This commit is contained in:
nora 2022-02-13 17:35:47 +01:00
parent 217a419ef1
commit 2903ba108e
8 changed files with 1208 additions and 1226 deletions

3
.gitignore vendored
View file

@ -1,2 +1,3 @@
/target
.idea
.idea
amqp0-9-1.xml

View file

@ -1,5 +1,7 @@
# amqp
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf
[amqp0-9-1 spec pdf](https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf)
https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf
[amqp 0-9-1 spec generated_pdf](https://www.rabbitmq.com/resources/specs/amqp-xml-doc0-9-1.pdf)
[amqp0-9-1 spec xml](https://www.rabbitmq.com/resources/specs/amqp0-9-1.xml)

View file

@ -79,7 +79,7 @@ struct Field {
}
fn main() {
let content = fs::read_to_string("./amqp-0-9-1.xml").unwrap();
let content = fs::read_to_string("./amqp-0-9-1-bsd.xml").unwrap();
let amqp = Amqp::from_str(&content).unwrap();
codegen(&amqp);

View file

@ -25,7 +25,9 @@ pub fn write_method<W: Write>(class: Class, mut writer: W) -> Result<(), TransEr
println!(" {field_name},");
}
println!(" }}) => {{");
println!(" writer.write_all(&[{class_index}, {method_index}])?;");
let [ci0, ci1] = class_index.to_be_bytes();
let [mi0, mi1] = method_index.to_be_bytes();
println!(" writer.write_all(&[{ci0}, {ci1}, {mi0}, {mi1}])?;");
let mut iter = method.fields.iter().peekable();
while let Some(field) = iter.next() {

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,13 @@
use crate::classes::FieldValue;
use crate::error::{ProtocolError, Result};
use crate::frame::{Frame, FrameType};
use crate::{classes, frame};
use anyhow::Context;
use std::collections::HashMap;
use std::net::SocketAddr;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream;
use tracing::{debug, error, warn};
use tracing::{debug, error};
const MIN_MAX_FRAME_SIZE: usize = 4096;
@ -46,11 +49,17 @@ impl Connection {
let start_method = classes::Class::Connection(classes::Connection::Start {
version_major: 0,
version_minor: 9,
server_properties: Default::default(),
mechanisms: vec![],
locales: vec![],
server_properties: server_properties(
self.stream
.local_addr()
.context("failed to get local_addr")?,
),
mechanisms: "none".to_string().into(),
locales: "en_US".to_string().into(),
});
debug!(?start_method, "Sending start method");
let mut payload = Vec::with_capacity(64);
classes::write::write_method(start_method, &mut payload)?;
frame::write_frame(
@ -98,3 +107,27 @@ impl Connection {
}
}
}
fn server_properties(host: SocketAddr) -> classes::Table {
fn ss(str: &str) -> FieldValue {
FieldValue::ShortString(str.to_string())
}
let host_str = host.ip().to_string();
let host_value = if host_str.len() < 256 {
FieldValue::ShortString(host_str)
} else {
FieldValue::LongString(host_str.into())
};
//HashMap::from([
// ("host".to_string(), host_value),
// ("product".to_string(), ss("no name yet")),
// ("version".to_string(), ss("0.1.0")),
// ("platform".to_string(), ss("microsoft linux")),
// ("copyright".to_string(), ss("MIT")),
// ("information".to_string(), ss("hello reader")),
// ("uwu".to_string(), ss("owo")),
//])
HashMap::new()
}

View file

@ -1,6 +1,7 @@
use crate::error::{ConException, ProtocolError, Result, TransError};
use anyhow::Context;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tracing::debug;
const REQUIRED_FRAME_END: u8 = 0xCE;
@ -33,6 +34,8 @@ pub async fn write_frame<W>(mut w: W, frame: &Frame) -> Result<()>
where
W: AsyncWriteExt + Unpin,
{
debug!(?frame, "sending frame");
w.write_u8(frame.kind as u8).await?;
w.write_u16(frame.channel).await?;
w.write_u32(u32::try_from(frame.payload.len()).context("frame size too big")?)