HTTP.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * http get client
  3.  * Copyright (c) 1999 Erick Engelke
  4.  */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <rtos.h>
  8. #include <net.h>
  9. #include <strlst.h>
  10. #define BUFFERSIZE 2048
  11. #define HTTPPORT        80
  12. #define HTTPVER10 "HTTP/1.0"
  13. int http_get( char *url, DWORD optgateway,
  14.     stringlist **asciiback,
  15.     void (*binback)(void *p, int len) )
  16. {
  17.     tcp_Socket *s;
  18.     char *host;
  19.     DWORD hostip;
  20.     int len;
  21.     char *buf;
  22.     int retval = 0;
  23.     int docopy = 0;
  24.     /* must be //host/... */
  25.     len = strlen( url );
  26.     if ( len < 3 ) return( 0 );
  27.     if ( memcmp( url, "//", 2 )) return( 0 );
  28.     s = kcalloc( sizeof( tcp_Socket ), 1 );
  29.     if ( s == NULL ) return( 0 );
  30.     do {
  31.         buf = kcalloc( BUFFERSIZE , 1 );
  32.         if ( buf == NULL ) break;
  33.         /* if we are using a gateway, we don't parse off the host name */
  34.         if ( optgateway == 0L ) {
  35.             host = url+2;       /* skip // */
  36.             url = strchr( host, '/');
  37.             if ( url == NULL ) break;
  38.             *url = 0;       /* temporary */
  39.             hostip = resolve( host );
  40.             if ( hostip == 0L ) break;
  41.             *url = '/';
  42.         } else
  43.             hostip = optgateway;
  44.         if (!tcp_open(s, 0, hostip, HTTPPORT, NULL)) break;
  45.         while ( ! sock_established( s ) ) {
  46.             if ( !tcp_tick( s )) break;
  47.             rt_sleep( 1 );
  48.         }
  49.         if ( ! tcp_tick( s )) break;
  50.         sock_mode( s, TCP_MODE_ASCII );
  51.         sprintf( buf, "GET %s HTTP/1.0rn", url );
  52.         sock_puts( s, buf );
  53.         sock_puts( s, "rn");
  54.         if ( asciiback != NULL ) {
  55.             *asciiback = strlst_new();
  56.             do {
  57.                 if ( sock_dataready( s )) {
  58.                     sock_gets( s, buf, BUFFERSIZE );
  59.                     rip( buf );
  60.                     if ( *buf == 0 )
  61.                         docopy = 1;
  62.                     if ( docopy && (*asciiback != NULL))
  63.                         strlst_add( *asciiback, buf );
  64.                 } else
  65.                     if ( ! tcp_tick( s )) break;
  66.                 rt_sleep(0);
  67.             } while ( 1 );
  68.         } else {
  69.             /* binary */
  70.             sock_mode( s, TCP_MODE_BINARY );
  71.             do {
  72.                 tcp_tick( NULL );
  73.                 len = sock_fastread( s, buf, BUFFERSIZE );
  74.                 if ( len == 0 ) {
  75.                     if ( !tcp_tick( s )) break;
  76.                     rt_sleep( 1 );
  77.                 } else
  78.                     (*binback)( buf, len );
  79.             } while( 1 );
  80.         }
  81.         sock_close( s );
  82.         while ( tcp_tick( s )) rt_sleep( 1 );
  83.         retval = 1;
  84.     } while ( 0 );
  85.     sock_abort( s );
  86.     kfree( s );
  87.     kfree( buf );
  88.     return( retval );
  89. }