GoAhead Compatibility Sample

The goaheadCompat sample demonstrates use of the GoAhead WebServer compatibility API module. For customers with existing GoAhead WebServer code, AppWeb supports the WebServer API so that previous WebServer applications can be easily migrated to AppWeb. The AppWeb compatibility API supports the WebServer ASP, GoForm and utility APIs.

To compile a program that uses the AppWeb compatibility API, you must include the appWeb/compatApi.h header and then link with the libappWebStatic library. The sample is a main program that listens on port 8888 for HTTP requests.

Files

goaheadCompat.conf
Makefile
goaheadCompat.c

Configuration File

goaheadCompat.conf

DocumentRoot "."
Listen 8888
ThreadLimit 0

AddHandler egiHandler .egi
AddHandler espHandler .esp .asp
AddHandler copyHandler

<Location /goform>
SetHandler egiHandler
</Location>

DirectoryIndex index.asp

The goaheadCompat.conf file is an AppWeb configuration file that activates the embedded server pages and embedded gateway interface, and static copy handlers. The GoAhead compatability API and AppWeb C APIs are linked directly from the appWebStatic library.

The sample must run single-threaded as the GoAhead WebServer API is not thread safe.

You should modify the DocumentRoot and Listen directives to suit your application's needs.

Makefile

The Makefile will build on Windows or Linux. A Windows VS 6.0 project file is also supplied.

Typical output from the Makefile build is listed below. This is the output on a Windows system:

cl -o goaheadCompat.exe goaheadCompat.c -Zi -Od -D_NDEBUG -W3 -nologo -MDd -FD -DWIN -D_DLL \
  -D_MT -D_WINDOWS -DWIN32 -D_WIN32_WINNT=0x500 -D_X86_=1 -D_CRT_SECURE_NO_DEPRECATE -D_USRDLL \
  -I../../../include  ../../../bin/libappWebStatic.lib ws2_32.lib advapi32.lib user32.lib
 

Source Code

goaheadCompat.c

/*  
 *  @file   goaheadCompat.c
 *  @brief  Demonstrate the GoAhead WebServer API compatibility
 *  Copyright (c) Mbedthis Software LLC, 2003-2005. All Rights Reserved.
 *  Portions Copyright (c) GoAhead Software, 1998-2000.
 */
/******************************* Includes *****************************/

#define     UNSAFE_FUNCTIONS_OK 1

#include    "appWeb/appWeb.h"

#if BLD_FEATURE_COMPAT_MODULE
/************************** Forward Declarations **********************/

static int  addMyExtensions();
static int  aspTest(int eid, webs_t wp, int argc, char_t **argv);
static void formTest(webs_t wp, char_t *path, char_t *query);
static void formWithError(webs_t wp, char_t *path, char_t *query);
static int  websHomePageHandler(webs_t wp, char_t *urlPrefix, 
                char_t *webDir, int arg, char_t *url, char_t *path, 
                char_t *query);

/********************************* Code *******************************/
/*
 *  See the addMyExtensions routine for the use of GoAhead APIs 
 */

int main(int argc, char** argv)
{
    MaHttp      *http;      /* For the http service inside our app */
    MaServer    *server;    /* For a HTTP server */

    /*
     *  Initialize the run-time and give our app a name "goaheadCompat"
     */
    mprCreateMpr("goaheadCompat");

    /*
     *  Do the following two statements only if you want debug trace
     */
    mprAddLogFileListener();
    mprSetLogSpec("stdout:2");

    /*
     *  Start run-time services
     */
    mprStartMpr(0);

    /*
     *  Create the HTTP and server objects. Give the server a name 
     *  "default" and define "." as the default serverRoot, ie. the 
     *  directory with the server configuration files.
     */
    http = maCreateHttp();
    server = maCreateServer(http, "default", ".");
    
    /*
     *  Activate the handlers. Only needed when linking statically.
     */
    mprEjsInit(0);
    mprEspInit(0);
    mprEgiInit(0);
    mprCopyInit(0);

    /*
     *  Configure the server based on the directives in goaheadCompat.conf.
     */
    if (maConfigureServer(server, "goaheadCompat.conf") < 0) {
        fprintf(stderr, 
            "Can't configure the server. Error on line %d\n", 
            maGetConfigErrorLine(server));
        exit(2);
    }

    /*
     *  Routine to demonstrate the GA Compatibility
     */
    addMyExtensions();
    
    /*
     *  Start serving pages. After this we are live.
     */
    if (maStartServers(http) < 0) {
        fprintf(stderr, "Can't start the server\n");
        exit(2);
    }

    /*
     *  Service events. This call will block until the server is exited
     *  Call mprTerminate() at any time to instruct the server to exit.
     *  The -1 is a timeout on the block. Useful if you use 
     *  MPR_LOOP_ONCE and have a polling event loop.
     */
    mprServiceEvents(MPR_LOOP_FOREVER, -1);

    /*
     *  Stop all HTTP services
     */
    maStopServers(http);

    /*
     *  Delete the server and http objects
     */
    maDeleteServer(server);
    maDeleteHttp(http);

    /*
     *  Stop and delete the run-time services
     */
    mprStopMpr();
    mprDeleteMpr();

    return 0;
}

/**********************************************************************/

static int addMyExtensions()
{
    void        *mp;
    char        *cp;
    sym_t       *sp;
    value_t     v;
    int         sd, rc;

    /*
     *  Define ASP and goForm functions
     */
    websAspDefine(T("aspTest"), aspTest);
    websFormDefine(T("formTest"), formTest);
    websFormDefine(T("formWithError"), formWithError);

    /*
     *  URL handler for the home page
     */
    websUrlHandlerDefine(T("/"), NULL, 0, websHomePageHandler, 0); 

    /*
     *  Test other miscellaneous routines. This is just to test the 
     *  syntax and to demonstrate basic operation. For full usage 
     *  details -- consult the GoAhead WebServer documentation.
     */
    mp = balloc(B_L, 5);
    brealloc(B_L, mp, 50);
    bfree(B_L, mp);
    mp = 0;
    bfreeSafe(B_L, mp);
    
    fmtAlloc(&cp, 256, "Hello %s", "World");
    bfree(B_L, cp);

    sd = symOpen(59);
    a_assert(sd >= 0);
    v.type = string;
    v.value.string = "444 Lake City Way";
    symEnter(sd, "Peter Smith", v, 0);
    sp = symLookup(sd, "Peter Smith");
    a_assert(sp);
    rc = symDelete(sd, "Peter Smith");
    a_assert(rc == 0);
    symClose(sd);

    return 0;
}

/********************************* ASP ********************************/
/*
 *  Typcial asp function. Usage "aspTest name address"
 */
static int aspTest(int eid, webs_t wp, int argc, char_t **argv)
{
    char_t  *name, *address;

    a_assert(websValid(wp));

    if (ejArgs(argc, argv, T("%s %s"), &name, &address) < 2) {
        websError(wp, 400, T("Insufficient args\n"));
        return -1;
    }
    return websWrite(wp, T("Name: %s, Address %s"), name, address);
}

/******************************* Goforms ******************************/
/*
 *  Typcial GoForm function. Parameters name address
 */

static void formTest(webs_t wp, char_t *path, char_t *query)
{
    char_t  *name, *address;

    /*
     *  The second parameter is an optional default
     */
    name = websGetVar(wp, T("name"), T("Joe Smith")); 
    address = websGetVar(wp, T("address"), T("1212 Milky Way Ave.")); 

    websHeader(wp);
    websWrite(wp, T("Name: %s, Address: %s\n"), 
        name, address);
    websFooter(wp);
    websDone(wp, 200);
}

/**********************************************************************/
/*
 *  GoForm returning an error to the browser
 */

static void formWithError(webs_t wp, char_t *path, char_t *query)
{
    websError(wp, 400, "Intentional error testing websError");
}

/**************************** URL Handlers ****************************/
/*
 *  URL handler for the home page. Called when "/" is requested.
 */

static int websHomePageHandler(webs_t wp, char_t *urlPrefix, 
    char_t *webDir, int arg, char_t *url, char_t *path, char_t *query)
{
    if (*url == '\0' || gstrcmp(url, T("/")) == 0) {
        websRedirect(wp, T("home.asp"));
        return 1;
    }
    return 0;
}

/**********************************************************************/
#else
int main()
{
    fprintf(stderr, "BLD_FEATURE_COMPAT_MODULE is not defined in config.h\n");
    exit(2);
}
#endif /* BLD_FEATURE_COMPAT_MODULE */

© Mbedthis Software LLC, 2003-2005. All rights reserved. Mbedthis is a trademark of Mbedthis Software LLC.