return None;
}
+
+ fn on_request_gap(&mut self, _size: u32) {
+ /* A gap in request data has been seen. For the purposes of this template
+ * we simply clear out the request buffer. */
+ self.request_buffer.truncate(0);
+ }
+
+ fn on_response_gap(&mut self, _size: u32) {
+ self.response_buffer.truncate(0);
+ }
}
/// Probe to see if this input looks like a request or response.
if eof {
// If needed, handled EOF, or pass it into the parser.
+ return AppLayerResult::ok();
}
let state = cast_pointer!(state, TemplateState);
- let buf = build_slice!(input, input_len as usize);
- state.parse_request(buf).into()
+
+ if input == std::ptr::null_mut() && input_len > 0 {
+ // Here we have a gap signaled by the input being null, but a greater
+ // than 0 input_len which provides the size of the gap.
+ state.on_request_gap(input_len);
+ AppLayerResult::ok()
+ } else {
+ let buf = build_slice!(input, input_len as usize);
+ state.parse_request(buf).into()
+ }
}
#[no_mangle]
}
};
let state = cast_pointer!(state, TemplateState);
- let buf = build_slice!(input, input_len as usize);
- state.parse_response(buf).into()
+
+ if input == std::ptr::null_mut() && input_len > 0 {
+ // Here we have a gap signaled by the input being null, but a greater
+ // than 0 input_len which provides the size of the gap.
+ state.on_response_gap(input_len);
+ AppLayerResult::ok()
+ } else {
+ let buf = build_slice!(input, input_len as usize);
+ state.parse_response(buf).into()
+ }
}
#[no_mangle]
get_tx_iterator: Some(rs_template_state_get_tx_iterator),
get_tx_data: rs_template_get_tx_data,
apply_tx_config: None,
- flags: 0,
+ flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
};
let ip_proto_str = CString::new("tcp").unwrap();