/* GET-Request via HTTP an einen Webserver */ 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>

/* HTTP-Port */
#define PORT 80

/* Groesse des Puffers */
#define BUFSIZE 8192

/* Filehandle-Nummer der Standard-Ausgabe */
#define STD_OUT 1

static void err_exit(char *error_message);

int main( int argc, char **argv)
  {
  struct sockaddr_in server;
  struct hostent *host_info;
  char buffer[BUFSIZE];
  int sock;
  int count;
    
  if (argc != 3) 
     err_exit("usage: httpget <server> <path/file>\n");

  /* Erzeuge das Socket */
  sock = socket(PF_INET, SOCK_STREAM, 0);
  if (sock < 0) 
     err_exit("failed to create socket");

  memset(&server, 0, sizeof (server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);

  /* Wandle den Servernamen in eine IP-Adresse um */
  host_info = gethostbyname( argv[1]);
  if (host_info == NULL) 
      err_exit("unknown server");
  memcpy((char *)&server.sin_addr, host_info->h_addr, host_info->h_length);

  /* Baue die Verbindung zum Server auf */
  if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) 
     err_exit("can't connect to server");

  /* Sende den HTTP-GET-Request */
  sprintf(buffer, "GET %s HTTP/1.0\r\n\r\n", argv[2]);
  send(sock, buffer, strlen( buffer), 0);

  /* Hole die Serverantwort und gib sie auf Konsole aus */
  do 
    {
    count = recv(sock, buffer, sizeof(buffer), 0);
    write(STD_OUT, buffer, count);
    }
  while (count > 0);

  /* Schliesse Verbindung und Socket */
  close(sock);
  return(EXIT_SUCCESS);
  }


/* Funktion gibt aufgetretenen Fehler aus und
 * beendet das Programm */
static void err_exit(char *error_message)
  {
  fprintf(stderr, "%s: %s\n", error_message, strerror(errno));
  exit(EXIT_FAILURE);
  }



