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

操作系统开发

开发平台:

DOS

  1. /* This example show a CGI script and Cookie in use
  2.  *
  3.  */
  4. #include <rtos.h>
  5. #include <net.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include <string.h>
  10. #include <graph.h>
  11. #include <smtpcli.h>
  12. #include <httpd.h>
  13. #include <strlst.h>
  14. char *webpassword = "rosebud";
  15. void web_password( tcp_Socket *s )
  16. {
  17.     html_hdr( s, "PASSWORD" );
  18.     sock_puts( s, "<p>The password you need to enter is ");
  19.     sock_puts( s, webpassword );
  20.     sock_puts( s, "</p>"
  21.                   "<form method="post" action="login">"
  22.                   "PASSWORD : "
  23.                   "<input type="TEXT" name="Password">"
  24.                   "<input type="submit" value="login">"
  25.                   "</form>");
  26.     html_tail(s);
  27. }
  28. void web_showform( tcp_Socket *s )
  29. {
  30.     char buf[ 128 ];
  31.     sprintf( buf, "<p>Free memory : %lu bytes</p>", kcorefree());
  32.     sock_puts( s, buf );
  33.     sock_puts( s, "<form method="post" action="square">"
  34.                   "Enter a number "
  35.                   "<input type="TEXT" name="NUMBER" value="23">"
  36.                   "<input type="submit" value="Square">"
  37.                   "<input type="reset"  value="Reset">"
  38.                   "</form>");
  39.     sock_puts( s, "<form method="post" action="logout">"
  40.                   "<input type="submit" value="Logout">"
  41.                   "</form>");
  42.     html_tail( s );
  43. }
  44. void web_index( tcp_Socket *s )
  45. {
  46.     FILE *f;
  47.     char buf[128];
  48.     sock_puts(s, "Content-Type: text/htmlrn");
  49.     html_hdr( s, "Welcome");
  50.     web_showform( s );
  51. }
  52. void web_ticket( tcp_Socket *s )
  53. {
  54.     char buffer[ 128 ];
  55.     sprintf( buffer, "Set-Cookie: Password=%s", webpassword );
  56.     sock_puts( s, buffer );
  57. }
  58. void web_login( tcp_Socket *s )
  59. {
  60.     stringlist *sl;
  61.     char *p, *q;
  62.     sl = cgi_getstrings( s );
  63.     if ( (p = strlst_findfirst( sl, "Password", NULL, &q )) != NULL ) {
  64.         if ( !stricmp( q, webpassword ) ) {
  65.             /* give them a cookie with the password embedded */
  66.             web_ticket( s );
  67.             /* and go to the main screen */
  68.             html_hdr(s,"Login Succeeded");
  69.             sock_puts(s,"<p>You successfully logged in.</p>");
  70.             web_showform( s );
  71.         } else
  72.             /* password failed */
  73.             web_password( s );
  74.     } else
  75.         /* no password given */
  76.         web_password( s );
  77.     cgi_freestrings( sl );
  78. }
  79. /*
  80.  * web_logout - erase the password cookie and go back to login screen
  81.  */
  82. void web_logout( tcp_Socket *s )
  83. {
  84.     sock_puts( s, "Set-Cookie: Password=" );
  85.     web_password( s );
  86. }
  87. void web_result( tcp_Socket *s )
  88. {
  89.     stringlist *sl;
  90.     char *p, *q;
  91.     DWORD x = 0;
  92.     char buf[ 128 ];
  93.     sock_puts(s, "Content-Type: text/htmlrn");
  94.     sl = cgi_getstrings( s );
  95.     if ( (p = strlst_findfirst( sl, "NUMBER", NULL, &q )) != NULL )
  96.         x = atol( q );
  97.     cgi_freestrings( sl );
  98.     html_hdr(s,"Simple CGI");
  99.     sprintf( buf, "<p>%lu squared is %lu</p>", x, x*x );
  100.     sock_puts(s, buf );
  101.     web_showform( s );
  102. }
  103. /*
  104.  * - the web server calls this proc for each web request
  105.  * - it is called in the context of *one* of the HTTPD threads,
  106.  *   though which is not known or important
  107.  * - multiple threads may be in the same proc at the same time
  108.  */
  109. void user_proc( tcp_Socket *s, char *cmd, char *file, char *ext,
  110.     stringlist *cookies )
  111. {
  112.     char *p, *q;
  113.     if ( !strcmp( file, "/logout"))
  114.         web_logout( s );
  115.     else if ( !strcmp( file, "/login" ))
  116.         web_login( s );
  117.     else {
  118.         /* check to see if ANY password given */
  119.         if (( p = strlst_findfirst( cookies, "Password", NULL, &q )) != NULL ) {
  120.             if ( !strcmp( q, webpassword )) {
  121.                 if ( !stricmp( file, "/square" )) web_result( s );
  122.                 else web_index( s );
  123.                 return;
  124.             }
  125.         }
  126.         /* either no password, or an incorrect one */
  127.         web_password( s );
  128.     }
  129. }
  130. main()
  131. {
  132.     int i;
  133.     kdebug = 1;
  134.     rt_init(100);
  135.     sock_init();            /* initialize network */
  136.     cputs("starting...rn");
  137. #define MAXHTTPD 5
  138.     for ( i = 0 ; i < MAXHTTPD; ++i )
  139.         rt_newthread( httpdthread, (DWORD)&user_proc, 8192, 0, "httpd worker" );
  140.     do {
  141.         /* nothing */
  142.         rt_yield();
  143.     } while ( 1 );
  144. }