我想钩附件文件。例如,当用户尝试使用网络邮件或其他附件来附加文件时,我也希望钩住附件。我分析了echo服务,在echo_check_preview_handler函数中,我可以钩住数据的内容。但是我想钩附件文件。我搜索了一些c-icap模块(squidclamav和yara),但是我没有找到此功能。从simple_api.c代码开始,我使用了下面的代码,但是我只能用data-> body-> filename钩住ascii文件。

data->body = ci_simple_file_new(0);
     if ((SEND_PERCENT_BYTES >= 0) && (START_SEND_AFTER == 0))
     {
        ci_req_unlock_data(req);
        ci_simple_file_lock_all(data->body);
     }

if (!data->body)
        return CI_ERROR;
       if (ci_simple_file_write(data->body, preview_data, preview_data_len,  ci_req_hasalldata(req)) == CI_ERROR)
               return CI_ERROR;

那么我该如何实现呢?是否有示例c-icap模块或文档或代码块?

最佳答案

您不应该在preview_handler中执行此操作,而是执行以下操作:

在Preview_handler中-返回CI_MOD_CONTINUE

然后在执行ci_simple_file_write的地方实现io ...

然后在数据处理程序的最后,您可以实现分析。

这是来自services.h的评论,简要解释了c-icap插件的生命周期:

  • 是实现服务的结构
    *
  • 要实现服务,需要有人实现成员
    该结构的功能。这些函数
  • 将由c-icap调用,如下所示:
  • 此服务的新请求到达->
    ci_service_module::mod_init_request_data称为
  • icap客户端发送预览数据->
    调用ci_service_module::mod_check_preview_handler。
  • 如果此函数返回CI_MOD_ALLOW204,则ICAP事务
    在这里停止。如果此函数返回
  • CI_MOD_CONTINUE,如果存在,ICAP客户端将发送其余主体数据。
  • 客户端开始发送更多数据->
    多次调用ci_service_module::mod_service_io,直到
  • 客户端已发送了所有正文数据。该服务可以开始发送
    使用此功能向客户端发送数据
  • 在所有数据都已收到
  • 之前
  • 客户端已发送所有数据->
    ci_service_module::mod_end_of_data_handler称为
  • 客户端等待从c-icap中读取其余数据->
    ci_service_module::mod_service_io称为多个
  • 次,直到所有正文数据发送到客户端
    * /

  • 否-您不能直接钩住附件,但是必须从通过ci_simple_file API编写的内容中解析出附件文件。

    关于c++ - c-icap和附件文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16772337/

    10-10 21:36