2013-05-27 59 views
2

我想掛鉤附件文件。例如,當用戶嘗試使用網絡郵件或其他東西附加文件時,我想要鉤住附件文件。我分析了回聲服務,在echo_check_preview_handler函數中我可以鉤住數據的內容。但我想掛鉤附件文件。我搜索了一些c-icap模塊(squidclamav和yara),但是我沒有找到這個能力。從simple_api.c代碼中,我使用了下面的代碼,但是我只能用data-> body-> filename來掛接ascii文件。c-icap和附件文件

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模塊或文檔或代碼塊?

回答

0

你不應該這樣做在preview_handler,而不是在這裏是你應該做的:

在preview_handler - 回報CI_MOD_CONTINUE

然後實現IO,你做ci_simple_file_write ...

那麼到底的數據處理程序可以實現您的分析。

這裏是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寫入。

0

例如,當用戶嘗試使用網絡郵件或別的什麼附加文件,我想太勾附件文件

您需要連接HTTP請求中包含的文件,因爲它的身體數據。

所以,你的目標是REQMOD ICAP請求。

這裏有3個您提示。

  1. 在預覽,檢查身體的魔力,確定身體類型爲 '文件數據'(ci_magic_data_type_ext幫助)。
  2. 在service_io,閱讀所有的數據,而iseof是不正確的(ci_simple_file ..功能幫助)。
  3. 在end_of_data,修改或檢查該文件作爲ci_simple_file對象。

牢記文件中的數據通常是gzip或deflate壓縮。

C-ICAP文檔可以與化妝DOC產生。

+0

在自己的評論中的信息應該是在職位本身。使用編輯功能。 – Unihedron