}
}
+ pub fn is_done(&self) -> bool {
+ self.file_open == false
+ }
+
fn open(&mut self, config: &'static SuricataFileContext,
files: &mut FileContainer, flags: u16, name: &[u8]) -> i32
{
tdf.chunk_count += 1;
let cs = tdf.file_tracker.update(files, flags, data, gap_size);
+ /* see if we need to close the tx */
+ if tdf.file_tracker.is_done() {
+ if direction == STREAM_TOCLIENT {
+ tx.response_done = true;
+ SCLogDebug!("TX {} response is done now that the file track is ready", tx.id);
+ } else {
+ tx.request_done = true;
+ SCLogDebug!("TX {} request is done now that the file track is ready", tx.id);
+ }
+ }
cs
},
None => { 0 },
}
+ let is_partial = reply.data.len() < reply.count as usize;
+ SCLogDebug!("partial data? {}", is_partial);
+
let found = match self.get_file_tx_by_handle(&file_handle, STREAM_TOCLIENT) {
Some((tx, files, flags)) => {
let ref mut tdf = match tx.type_data {
tx.nfs_response_status = reply.status;
tx.is_last = true;
tx.request_done = true;
- tx.response_done = true;
+
+ /* if this is a partial record we will close the tx
+ * when we've received the final data */
+ if !is_partial {
+ tx.response_done = true;
+ SCLogDebug!("TX {} is DONE", tx.id);
+ }
}
true
},
tx.nfs_response_status = reply.status;
tx.is_last = true;
tx.request_done = true;
- tx.response_done = true;
+
+ /* if this is a partial record we will close the tx
+ * when we've received the final data */
+ if !is_partial {
+ tx.response_done = true;
+ SCLogDebug!("TX {} is DONE", tx.id);
+ }
}
}