2017-06-01 151 views
0

我正面臨着一些問題,試圖讓我的身體內容在我的猴子服務器。實際上,我並不知道如何使用fastcgi庫函數來訪問我的數據。使用C中的FastCGI訪問PUT或POST請求的主體C

我跟郵遞員發送具有以下JSON內容上http://my.server.address:myport/cgi/something PUT請求:

{ "hello" : "bonjour" } 

在服務器端
主線程上運行:

int32_t SWEB_traiter_requette_f(int32_t i32_socket_listen) { 
    FCGX_Request st_request; 

    (void)FCGX_InitRequest(&st_request, i32_socket_listen, 0); 

    if (FCGX_Accept_r(&st_request) == 0) { 

     ULOG_log_f(ULOG_PRIO_INFO, "accepting request"); 
     (void)pthread_mutex_lock(gpu_mutex_s_web); 
     traiter_requette_s_web_f(&st_request,FCGX_GetParam("REQUEST_URI", st_request.envp)); 
     (void)pthread_mutex_unlock(gpu_mutex_s_web); 


     (void)FCGX_Finish_r(&st_request); 
    } 
    FCGX_Free(&st_request,i32_socket_listen); 

    return 0; 
} 

這就是我處理請求的方式:

static void traiter_requette_s_web_f(FCGX_Request *pst_request,const char * pc_url) { 
    size_t z_len; 
    char_t *pc_data; 
    int i = 0; 
    int ch; 
    char_t *sz_content_len = FCGX_GetParam("CONTENT_LENGTH" , pst_request->envp); 
    char_t *sz_method  = FCGX_GetParam("REQUEST_METHOD" , pst_request->envp); 
    char_t *sz_contenttype = FCGX_GetParam("CONTENT_TYPE" , pst_request->envp); 

    if (sz_contenttype != NULL){ 

     /* first method ..... not working */ 
     ch = FCGX_GetChar(pst_request->in); 
     while(ch != -1){ 
      i++; 
      z_len = strtol(sz_content_len, NULL, 10); 
      pc_data = calloc(1,z_len+1); 
      if (pc_data == NULL){ 
       //LCOV_EXCL_START 
       ULOG_log_f(ULOG_PRIO_ERREUR, "Erreur d'allocation de psz_data"); 
       return; 
       //LCOV_EXCL_STOP 
      } 
      pc_data[i-1] = (char_t) ch; 
      ch = FCGX_GetChar(pst_request->in); 
      if (ch == -1) 
      { 
       pc_data=(char*)realloc(pc_data,(i + 1)*sizeof(char)); 
       pc_data[i] = '\0'; 
      } 

     } 
     printf("data !! : %s\n",pc_data); 
     /* second method .... not working */ 

     z_len = strtol(sz_content_len, NULL, 10); 
     pc_data = calloc(1,z_len+1); 
     if (pc_data == NULL){ 
      //LCOV_EXCL_START 
      ULOG_log_f(ULOG_PRIO_ERREUR, "Erreur d'allocation de psz_data"); 
      return; 
      //LCOV_EXCL_STOP 
     } 
     (void)FCGX_GetStr(pc_data,z_len,pst_request->in); 
     printf("data !! : %s\n",pc_data); 

    } 
} 

也許我做錯了pc_data,這不是如何訪問正文。

我怎樣才能訪問我的請求?

+0

'...,FCGX_GetParam( 「REQUEST_URI」,st_request.envp)...'::什麼是'st_request.envp' ,一個指針? – joop

+0

通常情況下,PUT和POST數據通過標準輸入發送,因此您必須訪問該數據。但確定這個猴子圖書館能夠訪問它。 –

+0

'while(ch!= -1){++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ z_len = strtol(sz_content_len,NULL,10); pc_data = calloc(1,z_len + 1);'看起來你在'(ch!= EOF)'循環中。調用每個字符的calloc看起來像是一個內存泄漏給我。然後再爲每個角色計算'content_length'似乎也不正確。 – joop

回答

0

看來我的代碼泄漏了。
這是你上一個POST請求的主體內容:

static void traiter_requette_s_web_f(FCGX_Request *pst_request,const char * pc_url) { 
    size_t z_len; 

    int i = 0; 
    int ch; 
    char_t *sz_content_len = FCGX_GetParam("CONTENT_LENGTH" , pst_request->envp); 
    char_t *sz_method  = FCGX_GetParam("REQUEST_METHOD" , pst_request->envp); 
    char_t *sz_contenttype = FCGX_GetParam("CONTENT_TYPE" , pst_request->envp); 
    char_t *pc_data = FCGX_GetParam("REQUEST_URI", pst_request->envp); 

    if (sz_contenttype != NULL) 
    { 

     z_len = strtol(sz_content_len, NULL, 10); 
     pc_data = calloc(1,z_len+1); 
     if (pc_data == NULL){ 
      return; 
     } 
     ch = FCGX_GetChar(pst_request->in); 
     while(ch != -1){ 
      i++; 
      pc_data[i-1] = (char_t) ch; 
      ch = FCGX_GetChar(pst_request->in); 
      if (ch == -1) 
      { 
       pc_data=(char*)realloc(pc_data,(i + 1)*sizeof(char)); 
       pc_data[i] = '\0'; 
      } 

     }   
     printf("data !! : %s\n",pc_data); 
    } 
} 
+0

消毒您的循環。上面的代碼可以被髮送比指定的content_length多的字節的客戶端拷貝致死。所以你的循環應該在leas包含一個測試'i joop