#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define PORT 9000
#define BUFFER_SIZE 1024

int main(int argc, char **argv) {
  int serverSocket;
  struct sockaddr_in serverAddr;

  if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket failed");
    exit(EXIT_FAILURE);
  }

  serverAddr.sin_family = AF_INET;
  serverAddr.sin_addr.s_addr = INADDR_ANY;
  serverAddr.sin_port = htons(PORT);

  if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof serverAddr) <
      0) {
    perror("bind failed");
    exit(EXIT_FAILURE);
  }

  if (listen(serverSocket, 5) < 0) {
    perror("listen failed");
    exit(EXIT_FAILURE);
  }

  printf("Server listening on port %d\n", PORT);
  while (1) {

    struct sockaddr_in clientAddr;
    socklen_t clientAddr_len = sizeof clientAddr;
    int *clientSocket = malloc(sizeof(int));

    if ((*clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr,
                                &clientAddr_len)) < 0) {
      perror("accept failed");
      continue;
    }

    printf("Connected\n");

    char buf[BUFFER_SIZE];
    int bytes = recv(*clientSocket, buf, sizeof buf, 0);
    if (bytes < 0) {
      perror("error recv data from client");
      continue;
    }

    // strip the header
    char *data = strstr(buf, "\r\n\r\n");
    if (data) {
      printf("parsed data %s\n", data);
    }

    close(*clientSocket);
    printf("disconnected client.\n");
  }

  close(serverSocket);
  return 0;
}
