Previous: , Up: Steps in Implementing an Insecure HTTP Client   [Index]


1.3.1.5 Implementing the Insecure HTTP Client ‘main’ Function

The main routine that coordinates all of this is shown in Listing 1-3.

/**
 *  Simple command-line HTTP client.
 */

int main( int argc, char *argv[ ] )
{
  int client_connection;
  char *host, *path;
  struct hostent *host_name;
  struct sockaddr_in host_address;

  if ( argc < 2 )
    {
      fprintf( stderr, "Usage: %s: <URL>\n", argv[ 0 ] );
      return 1;
    }

  if ( parse_url( argv[ 1 ], &host, &path ) == -1 )
    {
      fprintf( stderr, "Error - malformed URL '%s . \n", argv[ 1 ] );
      return 1;
    }

  printf( "Conecting to host '%s'\n", host );

Listing 1.5: "http.c" main

After the URL has been parsed and the host is known, you must establish a socket to it. In order to do this, convert it from a human-readable host name, as ‘www.server.com’, to a dotted-decimal IP address, such as ‘100.218.64.2’. You call the standard gethostbyname library function to do this, and connect to the server. This is shown in Listing 1-4.

// Step 1: open a socket connection on http port with the destination host

  client_connection = socket( PF_INET, SOCK_STREAM, 0 );

  if ( !client_connection )
  {
    perror( "Unable to create a local socket" );
    return 2;
  }

  host_name = gethostbyname( host );

  if ( !host_name )
  {
    perror( "Error in name resolution" );
    return 3;
  }

  host_address.sin_family = AF_INET;
  host_address.sin_port = htons( HTTP_PORT );
  memcpy( &host_address.sin_addr, host_name->h_addr_list[ 0 ],
        sizeof( struct in_addr ) );

  if ( connect( client_connection, ( struct sockaddr * ) &host_address,
          sizeof( host_address ) ) == -1 )
  {
    perror( "Unable to connect to host" );
    return 4;
  }

  printf( "Retrieving document: '%s'\n", path );

Listing 1.6: "http.c" main (continued)

Assuming nothing went wrong:

You now have a usable (cleartext) socket with which to exchange data with the web server. Issue a ‘GET’ command, display the result, and close the socket, as shown in Listing 1-5.

// Step 2: Issue a GET command

  http_get( client_connection, path, host );

  display_result( client_connection );

  printf( "Shutting down.\n" );

  if (close( client_connection ) == -1 )
  {
    perror( "Error closing client connection" );
    return 5;
  }

  return 0;
}

Listing 1.7: "http.c" main-continued-2


Previous: , Up: Steps in Implementing an Insecure HTTP Client   [Index]