Linux下小型WEB服务器boa的使用(2)

前面的文章里讲了如何安装、配置boa,这篇文章主要讲一下一些boa测试实例,主要涉及到html以及cgi程序的编写。

测试环境:
虚拟机(虚拟机软件为VMware)Fedora(以下与Linux为同义词),Linux的IP为192.168.184.100,通过VMnet8方式与物理机MS Windows连接,使用常用浏览器访问,如IE、Maxthon、Chrome等。

html不用介绍了。cgi全称为Common Gate Interface,它不是一种具体的语言,它可以使用其它语言来实现,比如C、C++、Perl、shell,等等。我们使用C语言来编写cgi程序。

我们需要使用到两个文件,一个是用于页面显示的使用html语言编写的hello.html,该文件放到/var/www/html目录中。另一个是用于响应该页面的cgi程序hello.c,该程序使用C语言编写,编译方式为:

$ gcc hello.c –o hello.cgi

编译后的可执行文件hello.cgi放到/var/www/cgi-bin目录中

完整的hello.html如下:

<html>
<head>
<title>this is my first HTML page</title>
</head>

<body>
<center><p><h1>this is  is a simple test of <I>HTML</I></h1></p></center>
<center><img src="img/logo.jpg" alt="CST studio" />
hello from <a href="http://www.latelee.org"><b>Late Lee</b></a></center>

<br />

<center><p>you can visit my website at <a href = "http://www.latelee.org"></a></p><center>
<hr />

<!-- a test -->
  <form name="form1" action="/cgi-bin/hello.cgi" method="post">
   <table align="center">
      <tr><td align="center" colspan="2"></td></tr>
      <tr>
      <td align="center">user name</td>
      <td><input type="text" name="Username"></td>
      </tr>

      <tr>
        <td align="center">password</td>
        <td><input type="password" name="Password"></td>
      </tr>
      
      <tr>
        <td><input type="submit" value="login"></td>
        <td><input type="reset" value="cancel"></td>
      </tr>
    </table>
  </form>
</body>

</html>

这个html文件分两部分,前半部分是一些常见的页面显示语句,这里包括了标题、图片显示、超链接。后半部分是我们真正的测试程序,主要设计了两个输入框,分别输入用户名和密码;两个按钮,分别是登陆和清除,这里的“登陆”并非实际中的登陆,它只是测试cgi程序的响应,结果是显示输入的信息。
注意到这一句:

<form name="form1" action="/cgi-bin/hello.cgi" method="post">

它的action表明了由哪一个cgi程序来响应来自该页面的消息,而method为http响应的方法,常用的有两种,分别是“post”和“get”,这里非专业地介绍一下。post,顾名思义,就是“提交”,用于更新信息;而get,即“获取”,用于从服务器中获取、查询信息。在下文将会看到,这两者在地址栏中的区别,使用post方法时数据是不会在地址栏中显示的,而get方法则会显示。不过本文不介绍这两者的本质区别。

如果直接输入Linux的IP地址,则会显示Fedora Project的启动页面,而要访问我们的测试网页,还需要再添加一些目录才行。这里的实际地址应该是:

当然,IP地址需要根据实际情况而改变。

下面是响应的cgi程序hello.c完整代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char* get_cgi_data(FILE* fp, char* method)
{
    char* input;
    int len;
    int size=1024;
    int i=0;

    if (strcmp(method, "GET") == 0)  /**< GET method */
    {
        input = getenv("QUERY_STRING");
        return input;
    }

    else if (strcmp(method, "POST") == 0)  /**< POST method */
    {
        len = atoi(getenv("CONTENT_LENGTH"));
        input = (char*)malloc(sizeof(char) * (size+1));

        if (len == 0)
        {
            input[0] = '\0';
            return input;
        }

        while (1)
        {
            input[i] = (char)fgetc(fp);
            if (i == size)
            {
                input[i+1] = '\0';
                return input;
            }
            --len;

            if (feof(fp) || (!(len)))
            {
                i++;
                input[i] = '\0';
                return input;
            }
            i++;
        }
    }
    return NULL;
}

int main(void)
{
    char* input;
    char* method;
    char name[64];
    char passwd[64];
    int i=0;
    int j=0;

    printf("Content-type:text/html\n\n");
    printf("The following is query result:");
    method = getenv("REQUEST_METHOD");
    input = get_cgi_data(stdin, method);

    printf("string is: %s", input);
    int len = strlen(input);
     /* sizeof("username=") = 9 */
    for (i=9; i<len; i++)
    {        
        if (input[i] == '&')
        {
            name[j]='\0';
            break;
        }
        
        name[j++]=input[i];
    }

     /* sizeof("username=")+sizeof(&password=) = 19 */
    for (i=19+strlen(name),j=0; i<(int)strlen(input); i++)
    {
        passwd[j++] = input[i];
    }
    passwd[j]='\0';

    printf("your username is %s your password is %s\n", name, passwd);

    return 0;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzzsy.html