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
,這不是如何訪問正文。
我怎樣才能訪問我的請求?
'...,FCGX_GetParam( 「REQUEST_URI」,st_request.envp)...'::什麼是'st_request.envp' ,一個指針? – joop
通常情況下,PUT和POST數據通過標準輸入發送,因此您必須訪問該數據。但確定這個猴子圖書館能夠訪問它。 –
'while(ch!= -1){++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ z_len = strtol(sz_content_len,NULL,10); pc_data = calloc(1,z_len + 1);'看起來你在'(ch!= EOF)'循環中。調用每個字符的calloc看起來像是一個內存泄漏給我。然後再爲每個角色計算'content_length'似乎也不正確。 – joop