Как получить webhook с помощью C

#c

#c

Вопрос:

Я хочу получать webhook (HTTP POST) из kazoo с помощью моей программы на C. Я думаю, что это повышает мои знания, и это так забавно (я думаю, что раньше).

Я пытаюсь перехватить HTTP POST-запрос, но ничего не слышу. Что я делаю и неправильно понимаю?

Я могу настроить таргетинг на webhook, какой двоичный файл / скрипт он может выполнить, а затем сгенерировать событие.

Например («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 "-" "-"
  

Я могу перехватить это сообщение с помощью php, если я настроил свой скрипт на webhook (webhookExample.php )

Но если я попытаюсь перехватить это сообщение с помощью C, у меня ничего не получится : (

Почему я ничего не могу получить с помощью c и могу, если использую php?

Извините за странные вопросы и спасибо за ваше время

PS Как я могу отладить свою программу с помощью 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 okn");

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

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

// connect the socket 
if (connect(sockfd,(struct sockaddr *)amp;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 socketn");
else
    fprintf(fp, "ok - bytes > 0 %d |%s|n",bytes, response);
// close the socket 
close(sockfd);
fprintf(fp, "ok - ENDn");
fclose(fp);
return 0;
}
  

Результат для php-скрипта

 cat MYfile.txt
  

account_id=24..7amp;owner_id=3e03amp;request=udev2Cnsl@server.localamp;reseller_id=2c7amp;timestamp=63720841342amp;…

Результат для программы на 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. Теперь я могу обнаружить, что php: // вводит данные чтения HTTP-запроса POST. SeI может понять, следовательно, я могу прочитать это, но я не могу понять, какой адрес я бы настроил для чтения этих данных. Может быть, кто-нибудь знает?

Ответ №1:

Ответ абсурдно дешевый.

Сервер просто записывает текст в стандартный файл.

Для обработки сервера 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 openedn");
        return 0;
    }

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

cat CATCHED_HOOK.txt_1212232

account_id=2424c7amp;authorizing_id=0b3316d6amp;authorizing_type=deviceamp;call_direction=inboundamp;call_id=1169696amp;caller_id_name=udev1Cnslamp;caller_id_number=udev1Cnslamp;amp;amp;emergency_resource_used=falseamp;from=udev1Cnsl40ce.localamp;local_resource_used=trueamp;is_internal_leg=falseamp;owner_id=866ae5amp;request=300240ce.localamp;reseller_id=244e36be95324c7amp;timestamp=63722050107amp;to=300240ce.localamp;hook_event= channel_createok — END