Я хочу получить 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 "-" "-"
Я могу поймать этот POST по php, если я настроил webhook мой скрипт (webhookExample.php)
Но если я попытаюсь поймать этот POST с помощью C, у меня ничего не появится :(
Почему я не могу получить что-либо от 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 и просить = udev2Cnsl% 40server.local & reseller_id = 2C7 и метка времени = 63720841342 & ...
Результат для программы на С
cat MY_FLAG.txt_27968
sock ok
ok - conn |4|
ok - prepare for receive
ok - bytes > 0 0 ||
ok - received == total
ok - END