C++ CGI library GNU CgiCc and Linux

來源:互聯網
上載者:User

[size=medium]Download, Installation, Configuration:

Download: ftp://ftp.gnu.org/gnu/cgicc/

Unpack: tar xzf cgicc-X.X.X.tar.gz

Build Libraries:

    * cd cgicc-X.X.X/

    * ./configure --prefix=/usr (Default or /opt. Make sure you have write priviges to the directory.)

      If compiling to create a 32 bit library on a 64 bit Athelon:

      CXXFLAGS="-m32" CFLAGS="-m32" LDFLAGS="-m32"

      If installed in /opt then you will need to include:

          o Include path defined in the compile statement: -I/opt/include

          o Link command reference: -L/opt/lib

            or use LD_RUN_PATH or /etc/ld.so.conf

      I prefer to install into /usr to eliminate the configuration headaches.

    * make install

This will create and install include files, documentation and libraries:

    * Libraries:

      /usr/lib/libcgicc.a

               libcgicc.la

               libcgicc.so              (softlink to libcgicc.so.1.3.0)

               libcgicc.so.1            (softlink to libcgicc.so.1.3.0)

               libcgicc.so.1.3.0

    * Include files: /usr/include/cgicc/...

    * Documentation: /usr/doc/cgicc-X.X.X/index.html

      Also available at http://www.gnu.org/software/cgicc/doc/

Example:

The Web Page:

    Test CGIcc form

    Value 1 :

    Value 2 :

    Value 3 : Button1 Button2

HTML Form Source:

    <HTML>

    <HEAD><TITLE>Test CGIcc form</TITLE></HEAD>

    <BODY bgcolor="#cccccc" text="#000000">

    <H2>Test CGIcc form</H2>

    <P>

    <FORM method="post" action="/cgi-bin/testcgi">

    Value 1 :

    <input type="text" name="value1">

    <P>

    Value 2 :

    <select name="value2">

       <option value="option1">Option 1

       <option value="option2">Option 2

       <option value="option3">Option 3

    </select>

    <P>

    Value 3 :

    <input type="radio" name="value3" value="button1" checked="checked">Button1

    <input type="radio" name="value3" value="button2">Button2

    <input type="hidden" name="value4" value="data4">

    <P>

    <input type="submit" value="Submit">

    </FORM>

    </BODY>

    </HTML>

C++ CGI Source:

    #include <iostream>

    #include <vector>

    #include <string>

    #include "cgicc/CgiDefs.h"

    #include "cgicc/Cgicc.h"

    #include "cgicc/HTTPHTMLHeader.h"

    #include "cgicc/HTMLClasses.h"

    #include <stdio.h>

    #include <stdlib.h>

    using namespace std;

    using namespace cgicc;     // Or reference as cgicc::Cgicc formData; below in object instantiation.

    int main(int argc, char **argv)

    {

        try {

           Cgicc formData;

           // Send HTTP header: Content-type: text/html

           cout << HTTPHTMLHeader() << endl;

           // Print: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">

           cout << HTMLDoctype(HTMLDoctype::eStrict) << endl;

           // Print: <html lang="en" dir="LTR">

           cout << html().set("lang", "EN").set("dir", "LTR") << endl;

           // Set up the HTML document

           cout << html() << head() << title("Cgicc example") << head() << endl;

           cout <<
body().set("bgcolor","#cccccc").set("text","#000000").set("link","#0000ff").set("vlink","#000080")
<< endl;

           cout << h1("This is a demonstration of the GNU CgiCC library") << endl;

           form_iterator fvalue1 = formData.getElement("value1");

           if( !fvalue1->isEmpty() && fvalue1 != (*formData).end()) {

              cout << "Value1: " << **fvalue1 << endl;

           }

           else

              cout << "No text entered for value1" << endl;

           cout << p();

           form_iterator fvalue2 = formData.getElement("value2");

           if( !fvalue2->isEmpty() && fvalue2 != (*formData).end()) {

              // Note this is just a different way to access the string class.

              // See the YoLinux GNU string class tutorial.

              cout << "Value2: " << (**fvalue2).c_str() << endl;

           }

           cout << p();

           form_iterator fvalue3 = formData.getElement("value3");

           if( !fvalue3->isEmpty() && fvalue3 != (*formData).end()) {

              cout << "Value3: " << **fvalue3 << endl;

           }

           cout << p();

           form_iterator fvalue4 = formData.getElement("value4");

           if( !fvalue4->isEmpty() && fvalue4 != (*formData).end()) {

              cout << "Value4: " << **fvalue4 << endl;

           }

           // Close the HTML document

           cout << body() << html();

        }

        catch(exception& e) {

           // handle any errors here.

           cout << "ERROR!!" << endl;

        }

        return 0;   // To avoid Apache errors.

    }

Compile:

    * Compile and static link: (size: 1063688)

          o If installed in /opt/: g++ -o testcgi -I/opt/include testcgi.cpp /opt/lib/libcgicc.a

          o If installed in /usr/: g++ -o testcgi testcgi.cpp /usr/lib/libcgicc.a

    * Dynamic Link (at run time): (size: 48465)

          o If installed in /opt/: g++ -o testcgi -I/opt/include testcgi.cpp -L/opt/lib -lcgicc

          o If installed in /usr/: g++ -o testcgi testcgi.cpp -lcgicc

Run:

The following paths are for a Red Hat 7.x installation.

   1. Place web page in: /var/www/html/testcgi.html

   2. Place cgi in: /var/www/cgi-bin/testcgi

   3. Start Apache: service httpd start

   4. Test: http://localhost/testcgi.html

Debugging:

Debugging a "POST" method CGI:

    * Print environment for transaction:

      Code snipet to include in cgicc CGI program:

          // Function declaration

          void dumpEnvironment(const CgiEnvironment& env);

          ...

              const CgiEnvironment& env = cgi.getEnvironment();

             

              cout << env.getRequestMethod() << endl;

              ...     env.getPathInfo()        ...

              ...     env.getPathTranslated()

                      env.getReferrer()

                      env.getContentLength()

                      env.getPostData()

              ...

             

          Also: env.getRequestMethod(), env.getPathInfo(),
env.getPathTranslated(), env.getReferrer(), env.getContentLength(),
env.getPostData(), env.getRemoteHost(), env.getRemoteAddr(),
env.getAuthType(), env.getRemoteUser(), env.getRemoteIdent(),
env.getContentType(), env.getAccept(), env.getUserAgent(),
env.getServerSoftware(), env.getServerName(), env.getGatewayInterface(),
env.getServerProtocol(), env.getServerPort(), env.usingHTTPS(),
env.getRedirectRequest(), env.getRedirectURL(), env.getRedirectStatus(),
env.getCookies(), env.getQueryString(), env.getScriptName().

    * Set environment variables: . debug-env

          File: debug-env

          export HTTP_USER_AGENT="Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.7.3) Gecko/20041020"

          export SERVER_PORT=80

          export HTTP_HOST=localhost

          export DOCUMENT_ROOT="/var/www/html"

          export HTTP_ACCEPT_CHARSET="iso-8859-1,*,utf-8"

          export SCRIPT_FILENAME="/var/www/cgi-bin/env.sh"

          export REQUEST_URI="/cgi-bin/env.sh"

          export SCRIPT_NAME="/cgi-bin/program.cgi"

          export HTTP_REFERRER="http://localhost/web-page.html"

          export HTTP_CONNECTION=Keep-Alive""

          export REMOTE_PORT=32984

          export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"

          export PWD="/var/www/cgi-bin"

          export SERVER_ADMIN="root@localhost"

          export HTTP_ACCEPT_LANGUAGE=en

          export
HTTP_ACCEPT='text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'

          export REMOTE_ADDR='127.0.0.1'

          export SHLVL=1

          export SERVER_NAME=localhost

          export SERVER_SOFTWARE='Apache/2.0.52 (Fedora)'

          export QUERY_STRING=

          export SERVER_ADDR='127.0.0.1'

          export GATEWAY_INTERFACE='CGI/1.1'

          export SERVER_PROTOCOL='HTTP/1.1'

          export HTTP_ACCEPT_ENCODING=gzip

          export REQUEST_METHOD=POST

          export CONTENT_LENGTH=47

          export CONTENT_TYPE='application/x-www-form-urlencoded'

          export POST_DATA='formval1=VALUE1&formval2=VALUE2&formval3=VALUE3'

             

    * Create file for (standard input) stdin: echo $POST_DATA > debug-stdin

    * Run in dbx:

          o dbx program.cgi

          o break ##### (Set breakpoints)

          o run < debug-stdin

      OR

      If not debugging, just run: echo $POST_DATA | ./program.cgi

Links:

    * GNU CgiCC Home page

          o CgiCC Documentation

    * YoLinux C++ Tutorials and info

    * More source code examples:

          o Generic test: test.cpp

          o Upload a file: upload.cpp

          o Drop a cookie: cookie.cpp

http://www.lslnet.com/linux/f/docs1/i34/big5261271.htm

http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CGI.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.