如何通过C接收webhook

时间:2019-04-02 18:50:06

标签: c

我想通过我的C程序接收kazoo的webhook(HTTP POST)。 我认为它增加了我的知识,而且它是如此有趣(我认为较早)。

我尝试捕获HTTP POST请求,但听不到任何声音。我该怎么做并且理解错了?

我可以将它执行的二进制/脚本作为目标,然后生成事件。

例如(“ http://server/c/hookreceiver.bin”)和完整示例

curl -X PUT -H "X-Auth-Token: $AUTH_TOKEN" -d '{"data":{"name": "hookreceiver.bin", "uri": "http://server/c/hookreceiver.bin","http_verb": "post","hook": "channel_create","retries":4}}'

apache日志:

"POST /c/hookreceiver.bin HTTP/1.1" 500 527 "-" "-"

如果我设置为对脚本(webhookExample.php)进行webhook设置,则可以通过php捕获此POST。

但是,如果我尝试通过C捕获此POST,我什么都没有:(

为什么我不能用c接收任何信息,如果我使用php可以接收?

很抱歉出现奇怪的问题 谢谢您的宝贵时间

P.S。 在这种模式下,如何通过gdb或其他方式调试程序,然后二进制调用其他应用程序?

webhookExample.php

<?php
$data = file_get_contents("php://input");
$my_file = 'MYfile.txt';
$handle = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file);
fwrite($handle, $data);
fclose($handle);
?>

file hookreceiver.bin
int main(int argc,char *argv[])
{
int portno =        80;
char *host =        "SERVER_NAME";

struct hostent *server;
struct sockaddr_in serv_addr;
int sockfd, bytes, received, total;
char response[4096];

FILE *fp;
char name1[] = "./MY_FLAG.txt";
char name[100];
sprintf(name, "%s_%d",name1,  getpid() );
if ((fp = fopen(name, "w")) == NULL) {
    // Error open
    return 0;
}

// create the socket 
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) fprintf(fp, "ERROR opening socket");
else            fprintf(fp, "sock ok\n");

// lookup the ip address 
server = gethostbyname(host);
if (server == NULL) fprintf(fp, "ERROR, no such host");

// fill in the structure 
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
    memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);

// connect the socket 
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
    fprintf(fp, "ERROR connecting");
else
    fprintf(fp, "ok - conn |%d|\n", sockfd );
fflush(fp);

bytes = read(sockfd,response+received,4096,NULL, MSG_NOSIGNAL);
if (bytes < 0)
    fprintf(fp, "ERROR reading response from socket\n");
else
    fprintf(fp, "ok - bytes > 0 %d |%s|\n",bytes, response);
// close the socket 
close(sockfd);
fprintf(fp, "ok - END\n");
fclose(fp);
return 0;
}

php脚本的结果

cat MYfile.txt

account_id = 24..7&owner_id = 3e03&request = udev2Cnsl%40server.local&reseller_id = 2c7&timestamp = 63720841342&...

C程序的结果

cat MY_FLAG.txt_27968 
sock ok
ok - conn |4|
ok - prepare for receive
ok - bytes > 0 0 ||
ok - received == total
ok - END

1 个答案:

答案 0 :(得分:0)

答案最便宜。

服务器是简单地将文本写入标准输入。

要处理webhook服务器,请执行HTTP POST请求“ POST /c/hookreceiver.bin HTTP / 1.1”

并调用二进制hookreceiver.bin

int main(int argc,char *argv[])
{    
    FILE *fp;    
    char name1[] = "./CATCHED_HOOK.txt";    
    char buf[1];    

    sprintf(name, "%s_%d",name1,  getpid() );    

    if ((fp = fopen(name, "w")) == NULL) {
        printf("File not opened\n");
        return 0;
    }

    while(read(0,buf, sizeof(mbuf))>0) {
        fprintf(fp,buf);
    }
    fclose(fp);
    return 0;
}

cat CATCHED_HOOK.txt_1212232

ACCOUNT_ID = 2424c7&authorizing_id = 0b3316d6&authorizing_type =设备&call_direction =入境&CALL_ID = 1169696&caller_id_name = udev1Cnsl&caller_id_number = udev1Cnsl &&& emergency_resource_used =假从= udev1Cnsl40ce.local&local_resource_used =真is_internal_leg =假owner_id = 866ae5&请求= 300240ce.local&reseller_id = 244e36be95324c7&时间戳= 63722050107&到= 300240ce.local&hook_event = channel_createok - END