aboutsummaryrefslogtreecommitdiff
path: root/src/Content.c
diff options
context:
space:
mode:
authorallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-19 23:35:56 +0000
committerallen <allen@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2000-09-19 23:35:56 +0000
commitc1e6b818b3ad317850015cd9a80e7513a9660ffd (patch)
tree95bb822ece5a3069a30035f527aa4d49905f987a /src/Content.c
parent7bc89f775b9129148f1bc9e1d5197ee13f3faca6 (diff)
Moved headers to a separate file, they are now callable by a function.
Added page about groups and variables Added parameter file name, current time and date git-svn-id: http://svn.cactuscode.org/arrangements/CactusConnect/HTTPD/trunk@52 1faa4e14-9dd3-4be0-9f0e-ffe519881164
Diffstat (limited to 'src/Content.c')
-rw-r--r--src/Content.c440
1 files changed, 294 insertions, 146 deletions
diff --git a/src/Content.c b/src/Content.c
index dcca26e..b708d16 100644
--- a/src/Content.c
+++ b/src/Content.c
@@ -14,6 +14,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "cctk.h"
@@ -65,6 +66,7 @@ static int RegisterImages(void);
static int RegisterParameterPages(void);
static int MainPage(cGH *cctkGH, httpRequest *request, void *data);
+static int AboutPage(cGH *cctkGH, httpRequest *request, void *data);
static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data);
static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data);
@@ -82,12 +84,16 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data);
********************* Other Routine Prototypes *********************
********************************************************************/
+int HTTPi_RegisterGroupsPages(void);
+
+
/********************************************************************
********************* Local Data *****************************
********************************************************************/
static struct httpLink *ContentLinks = NULL;
+
#define USER_LENGTH 255
/********************************************************************
********************* External Routines **********************
@@ -138,6 +144,9 @@ int HTTP_RegisterPages(void)
/* Register the master page. */
HTTP_RegisterPage("/index.html", MainPage, NULL);
+ /* Register the server description page */
+ HTTP_RegisterPage("/About.html", AboutPage, NULL);
+
/* Register parameter stuff */
RegisterParameterPages();
@@ -150,6 +159,9 @@ int HTTP_RegisterPages(void)
"Control Panel for this run",
HTTP_QUICKLINK);
+ /* Register Groups Pages */
+ HTTPi_RegisterGroupsPages();
+
HTTP_AuthAddUser("user",user,password,encryption_scheme);
/* Register images */
@@ -157,7 +169,7 @@ int HTTP_RegisterPages(void)
HTTP_RegisterPage("/cookies.html", CookieTestPage, NULL);
-
+ return 0;
}
/*@@
@@ -246,37 +258,6 @@ static int CompareStrings(const void *string1, const void *string2)
******************************************************************************/
-static const char *cactus_mainheader =
-"</HEAD>\n"
-"<BODY BGCOLOR=\"#FFFFFF\""
-" link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n"
-"<center><A HREF=\"http://www.cactuscode.org/\">"
-"<img src=\"/Images/wwwcactuscodeorg.jpg\""
-" alt=\"Cactus\" BORDER=0></A>"
-"</A>"
-"<table width=70% border=0><tr><td>"
-"\n";
-
-static const char *cactus_header =
-"</HEAD>\n"
-"<BODY BGCOLOR=\"#FFFFFF\""
-" link=\"#1B831D\" vlink=\"#768000\" alink=\"#00FF00\">\n"
-"<center>"
-"</A>"
-"<table width=70% border=0><tr><td>"
-"\n";
-
-static const char *cactus_footer =
-"</table>"
-"\n"
-"<HR size=1>\n"
-"<ADDRESS><DIV ALIGN=left>\n"
-"<SMALL>\n"
-"<A HREF=\"http://www.cactuscode.org/\">Cactus Home Page</A><BR>\n"
-"Cactus Web Interface by <A HREF=\"mailto:cactusmaint@cactuscode.org\">The Cactus Team</A><BR>\n"
-"</SMALL></DIV></ADDRESS></BODY></HTML>\n";
-
-
/*@@
@routine MainPage
@date Wed Sep 13 23:47:43 2000
@@ -298,6 +279,7 @@ static const char *cactus_footer =
static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
{
int retval;
+ int filelen;
char message[4098];
struct httpLink *link;
@@ -317,7 +299,8 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
HTTP_Write(request, message, strlen(message));
/* Write out the main header part */
- HTTP_Write(request, cactus_mainheader, strlen(cactus_mainheader));
+ HTTP_ContentHeader(1,4096,message);
+ HTTP_Write(request, message, strlen(message));
strcpy(message, "<center><h1>Simulation Home Page</h1></center>");
@@ -345,13 +328,14 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* Some blurb */
strcpy(message, "<br>"
- "<center><table cellspacing=5 cellpadding=5 border=0><tr><td valign=top>"
- "<h3>Simulation web server:</h3>"
- "<p>This browser is connected to a Cactus simulation which contains "
- "a web server thorn. This thorn allows you to monitor the simulation, "
- "and view and change parameters</p>"
- "<p>Depending on which other thorns are active, there may be additional "
- "features available, such as the viewing and downloading of output files</p>");
+ "<center><table cellspacing=5 cellpadding=5 border=0><tr>"
+ "<td valign=top><h3>Simulation web server:</h3>"
+ "<p>This browser is connected to a Cactus simulation which "
+ "contains a web server thorn. This thorn allows you to "
+ "monitor the simulation, and view and change parameters</p>"
+ "<p>Depending on which other thorns are active, there may "
+ "be additional features available, such as the viewing and "
+ "downloading of output files</p>");
HTTP_Write(request, message, strlen(message));
@@ -380,12 +364,37 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* CONFIGURATION DETAILS */
sprintf(message, "<h3>Configuration:</h3>"
- "<ul> <li>Flesh version <FONT COLOR=RED> %s"
- "</FONT></li>\n"
- "<li>Code compiled on <FONT COLOR=RED>"
- __DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__ "</font></li>\n"
- "</ul>", CCTK_FullVersion());
+ "<ul> <li>Flesh version <FONT COLOR=RED> %s"
+ "</FONT></li>\n"
+ "<li>Code compiled on <FONT COLOR=RED>"
+ __DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__
+ "</font></li>\n"
+ , CCTK_FullVersion());
+
+ strcat(message,"<li> Parameter filename <font color=red>");
+ HTTP_Write(request, message, strlen(message));
+
+ filelen = CCTK_ParameterFilename(4098,message);
+ HTTP_Write(request, message, filelen);
+
+ strcpy(message,"</font>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ if (cctkGH)
+ {
+ if (CCTK_nProcs(cctkGH) == 1)
+ {
+ strcpy(message,"<li>Single processor run</li>");
+ }
+ else
+ {
+ sprintf(message," <li>Multiprocessor run on %d CPUs</li>",
+ CCTK_nProcs(cctkGH));
+ }
+ HTTP_Write(request, message, strlen(message));
+ }
+ strcpy(message,"</UL>");
HTTP_Write(request, message, strlen(message));
/******************************************************************************/
@@ -409,8 +418,7 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
"<li>Iteration number <FONT COLOR=RED> %d"
"</FONT></li>\n",
cctkGH->cctk_time,
- cctkGH->cctk_iteration);
-
+ cctkGH->cctk_iteration);
}
else
{
@@ -476,7 +484,8 @@ static int MainPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4096,message);
+ retval = HTTP_Write(request, message, strlen(message));
/* retval = HTTP_Write(request, base_page, strlen(base_page)); */
@@ -561,17 +570,20 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
HTTP_Write(request, message, strlen(message));
/* Start the page */
- strcpy(message, "<HTML><HEAD><TITLE>Cactus Parameters Request</TITLE></HEAD>\n");
- strcat(message, cactus_header);
- strcat(message,"<BODY>");
+ strcpy(message, "<HTML><HEAD><TITLE>Cactus Parameters Request</TITLE>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message,"<HTML>\n");
+ HTTP_Write(request, message, strlen(message));
+
+ HTTP_ContentHeader(0,4098,message);
HTTP_Write(request, message, strlen(message));
strcpy(message, "<center>");
HTTP_Write(request, message, strlen(message));
strcpy(message,
- "<center><H2>Check/Modify Parameters</H2></center>\n"
- "<center>[<A HREF=\"/\">This Simulation Homepage</A>]</center>\n"
+ "<center><H1>Check/Modify Parameters</H1></center>\n"
"</center><p>From this page you can check the values \n"
"of all parameters for the \n"
"simulation, and modify any parameters which have been designated as <i>steerable</i></p>\n"
@@ -602,12 +614,13 @@ static int MainParameterPage(cGH *cctkGH, httpRequest *request, void *data)
}
}
- strcpy(message,"</table></BLOCKQUOTE></center>");
+ strcpy(message,"</table></center>");
HTTP_Write(request, message, strlen(message));
/* Write out the footer part. */
-
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
return retval;
}
@@ -640,20 +653,23 @@ static const char *notauthorized_page =
@@*/
static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
{
- int retval;
+ int retval=0;
char message[4098];
- int i;
const char *thorn;
int first;
const cParamData *pData;
char *value;
- const char *prefix;
const httpArg *argument;
char user[USER_LENGTH+1];
int notauthorised;
int readonly;
+ int param_type;
+ int param_bool;
+ int nsteerable=0;
+ int nfixed=0;
+
thorn = (const char *)data;
notauthorised = HTTP_AuthenticateBasic(request, "user", user, USER_LENGTH);
@@ -749,45 +765,45 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
sprintf(message,
"<HTML><HEAD><TITLE>Cactus Parameters Request : %s</TITLE></HEAD>\n", thorn);
- strcat(message, cactus_header);
+ HTTP_ContentHeader(0,4098,message);
strcat(message,"<BODY>");
HTTP_Write(request, message, strlen(message));
- strcpy(message, "<center>");
- HTTP_Write(request, message, strlen(message));
-
if (!CCTK_IsThornActive(thorn))
{
- sprintf(message,"<BLOCKQUOTE><P><B> Thorn %s is not active !!!</B><BR></BLOCKQUOTE>\n",thorn);
+ sprintf(message,"<B> Thorn %s is not active !!!</B><BR>\n",thorn);
HTTP_Write(request, message, strlen(message));
}
else
{
- strcpy(message,"<BLOCKQUOTE>");
- HTTP_Write(request, message, strlen(message));
-
/* Send table of available parameters for given thorn */
/* Steerable parameters can be edited in a FORM. */
sprintf(message,
- "<center><H2>Check/Modify Parameters for Thorn <FONT COLOR=RED> %s</FONT></H2></center>\n",
+ "<center><H1>Check/Modify Parameters</H1>"
+ "<H2>Thorn %s</H2></center>\n",
thorn);
strcat(message,
- "<center>[<A HREF=\"/\">This Simulation Homepage</A>]</center>\n"
- "<p>Steerable parameters can be identified by the presence of a form input box, \n"
- "to change the value of a parameter, simply edit the value in the box and press \n"
- " the submit button to register the new values.</p><center>\n"
- "<p>Return to <a href=\"../\">active thorn list</a></p>\n"
- "<TABLE BORDER= 0 CELLSPACING=5 CELLPADDING=5>\n");
+ "<p>Parameters in Cactus can be either <i>fixed</i> or <i>steerable</i>. "
+ "Steerable parameters are those which can be modified during a "
+ "simulation"
+ "To change steerable parameters, edit the values and press \n"
+ " the submit button."
+ "Before applying the new parameter value, Cactus will check that"
+ " the parameter lies in the allowed range. Note that there"
+ " is currently no log of parameters which have been modified.</p>\n"
+ "<p>The tables below show the parameter name, current value and description."
+ "The default value of each parameter is shown in brackets at the end of the description.</p>"
+ "<center><p><a href=\"../\">View parameters from another thorn</a></p>\n");
HTTP_Write(request, message, strlen(message));
- if(!readonly)
+ if(!readonly )
{
- sprintf(message,"<FORM ACTION=\"/Parameters/%s/\"><TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT VALUE=\"Update all parameters\"></TD></TR>\n", thorn);
- HTTP_Write(request, message, strlen(message));
+ sprintf(message,"<FORM ACTION=\"/Parameters/%s/\">",thorn);
+ HTTP_Write(request, message, strlen(message));
}
- /* Walk through all parameters of given implementation. */
+ /* Walk through all steerable parameters of given implementation. */
first = 1;
while(CCTK_ParameterWalk(first, thorn, NULL, &pData) == 0)
@@ -797,37 +813,40 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
value = CCTK_ParameterValString (pData->name, pData->thorn);
if(value)
- {
- if (pData->scope == SCOPE_PRIVATE)
- {
- prefix = pData->thorn;
- }
- else
- {
- prefix = CCTK_ThornImplementation (pData->thorn);
- }
-
+ {
if (pData->steerable == CCTK_STEERABLE_ALWAYS && !readonly)
{
- sprintf(message,
- "%s<TR><TD align=left valign=center><font color=red>%s::%s</font></TD>"
- "<TD align=left valign=center><INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\">"
- "</TD></TR>\n",
- message,prefix, pData->name, pData->name, value);
- }
- else
- {
- /* FIXME: This is a hack - should put in parameter tags. */
- if(strcmp(thorn,CCTK_THORNSTRING) ||
- (strcmp(pData->name,"user") &&
- strcmp(pData->name,"password") &&
- strcmp(pData->name,"encryption_scheme")))
- {
- sprintf(message,
- "%s<TR><TD align=left valign=center>%s::%s</TD>"
- "<TD>%s</TD></TR>\n",
- message, prefix,pData->name, value);
- }
+
+ if (nsteerable == 0)
+ {
+ strcat(message,"<h2>Steerable Parameters</h2>"
+ "<table cellpadding=5 cellspacing=5>");
+ }
+ nsteerable++;
+
+ if (pData->type == PARAMETER_BOOLEAN)
+ {
+ param_bool = *((CCTK_INT *)CCTK_ParameterGet(pData->name,thorn,&pData->type));
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD align=left valign=center>"
+ "Yes <INPUT type=\"radio\" name=\"%s\" %s value=\"1\">"
+ "&nbsp; No <INPUT type=\"radio\" name=\"%s\" %s value=\"0\">"
+ "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
+ message,pData->name,pData->name,
+ param_bool ? "checked" : "", pData->name,
+ param_bool ? "" : "checked",pData->description,pData->defval);
+ }
+ else
+ {
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD align=left valign=center>"
+ "<INPUT TYPE=TEXT NAME=\"%s\" VALUE=\"%s\">"
+ "</TD><TD><SMALL>%s (%s)</SMALL></TR>\n",
+ message, pData->name, pData->name,
+ value, pData->description,pData->defval);
+ }
}
free (value);
}
@@ -835,16 +854,66 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
}
- if(!readonly)
+ if (nsteerable>0)
+ {
+ strcpy(message, "</TABLE>\n");
+ HTTP_Write(request, message, strlen(message));
+ }
+
+ if(!readonly && nsteerable>0)
{
strcpy(message,
- "<TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT VALUE=\"Update all parameters\"></TD></TR>\n"
+ "<INPUT TYPE=SUBMIT VALUE=\"Update all parameters\">\n"
"</FORM>\n");
HTTP_Write(request, message, strlen(message));
}
- strcpy(message, "</TABLE><P></BLOCKQUOTE>\n");
- HTTP_Write(request, message, strlen(message));
+
+ /* Walk through non-all steerable parameters of given implementation. */
+ first = 1;
+
+ while(CCTK_ParameterWalk(first, thorn, NULL, &pData) == 0)
+ {
+ first = 0;
+ strcpy(message,"");
+
+ value = CCTK_ParameterValString (pData->name, pData->thorn);
+ if(value)
+ {
+ if (!(pData->steerable == CCTK_STEERABLE_ALWAYS && !readonly))
+ {
+
+ if (nfixed == 0)
+ {
+ strcat(message,"<h2>Fixed Parameters</h2>"
+ "<table cellpadding=5 cellspacing=5>");
+ }
+ nfixed++;
+
+ /* FIXME: This is a hack - should put in parameter tags. */
+ if(strcmp(thorn,CCTK_THORNSTRING) ||
+ (strcmp(pData->name,"user") &&
+ strcmp(pData->name,"password") &&
+ strcmp(pData->name,"encryption_scheme")))
+ {
+ sprintf(message,
+ "%s<TR><TD align=left valign=center>%s</TD>"
+ "<TD>%s</TD><TD><SMALL>%s (%s)</SMALL></TD></TR>\n",
+ message,pData->name, value, pData->description,pData->defval);
+ }
+ free(value);
+ }
+ }
+ HTTP_Write(request, message, strlen(message));
+
+ }
+
+ if (nfixed>0)
+ {
+ strcpy(message, "</TABLE>\n");
+ HTTP_Write(request, message, strlen(message));
+ }
+
}
strcpy(message,"</center>");
@@ -853,7 +922,8 @@ static int ThornParameterPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
} /* n_arguments > 0 */
return retval;
@@ -968,10 +1038,9 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
DECLARE_CCTK_PARAMETERS
int retval;
- char message[4096];
+ char message[4098];
int notauthorised;
- struct httpLink *link;
char thisuser[USER_LENGTH+1];
@@ -999,30 +1068,18 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
/* Start the page */
strcpy(message, "<HTML><HEAD><TITLE>Cactus Control and Status Page</TITLE>\n");
- strcat(message, cactus_mainheader);
- strcat(message, "<center><h1>Simulation Home Page</h1></center>");
+ HTTP_ContentHeader(0,4098,message);
+ strcat(message, "<center><h1>Control and Status Page</h1></center>");
HTTP_Write(request, message, strlen(message));
- if(ContentLinks)
- {
- strcpy(message, "<center>Quick links: ");
-
- for(link = ContentLinks; link; link=link->next)
- {
- if(link->flags & HTTP_QUICKLINK)
- {
- sprintf(message,
- "%s[<A HREF=\"%s\">%s</a>]",
- message,
- link->URL,
- link->name);
- }
- }
- strcat(message,"</center>\n<br>\n");
+ strcpy(message,
+ "<P>This page is the control center for interacting with"
+ " the current simulation. It is possible to steer certain"
+ " parameters, as well as pause, restart, or terminate the"
+ " simulation.</P>");
- HTTP_Write(request, message, strlen(message));
- }
+ HTTP_Write(request, message, strlen(message));
strcpy(message,
"<CENTER>\n"
@@ -1058,7 +1115,8 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
}
else
{
@@ -1106,7 +1164,7 @@ static int ControlPage(cGH *cctkGH, httpRequest *request, void *data)
@@*/
static int ControlSet(cGH *cctkGH, httpRequest *request)
{
- char message[4096];
+ char message[4098];
const char *runstate;
runstate = HTTP_ArgumentValue(request,"runstate");
@@ -1161,7 +1219,7 @@ static int ControlSet(cGH *cctkGH, httpRequest *request)
static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
{
int retval;
- char message[4096];
+ char message[4098];
/* Status message */
strcpy(message,"HTTP/1.0 200 OK\r\n");
@@ -1179,7 +1237,8 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
HTTP_Write(request, message, strlen(message));
/* Write out the main header part */
- HTTP_Write(request, cactus_mainheader, strlen(cactus_mainheader));
+ HTTP_ContentHeader(1,4098,message);
+ HTTP_Write(request, message, strlen(message));
strcpy(message, "<center><h1>Simulation Home Page</h1></center>");
@@ -1205,10 +1264,27 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
"</FONT></li>\n"
"<li>Code compiled on <FONT COLOR=RED>"
__DATE__ "</FONT> at <FONT COLOR=RED>"__TIME__ "</font></li>\n"
- "</ul>", CCTK_FullVersion());
+ ,CCTK_FullVersion());
HTTP_Write(request, message, strlen(message));
+ if (cctkGH)
+ {
+ if (CCTK_nProcs(cctkGH) == 1)
+ {
+ strcpy(message,"<li>Single processor run</li>");
+ }
+ else
+ {
+ sprintf(message," <li>Multiprocessor run on %d CPUs</li>",
+ CCTK_nProcs(cctkGH));
+ }
+ HTTP_Write(request, message, strlen(message));
+ }
+
+ strcpy(message,"</UL>");
+ HTTP_Write(request, message, strlen(message));
+
/******************************************************************************/
/* NEW COLUMN */
@@ -1231,11 +1307,10 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
"</FONT></li>\n",
cctkGH->cctk_time,
cctkGH->cctk_iteration);
-
}
else
{
- strcpy(message, "<li>Current cactus time is unknown</li>\n");
+ strcpy(message, "<li>Current cactus state is unknown</li>\n");
}
HTTP_Write(request, message, strlen(message));
@@ -1301,7 +1376,8 @@ static int ControlTerminationPage(cGH *cctkGH, httpRequest *request)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
/* retval = HTTP_Write(request, base_page, strlen(base_page)); */
@@ -1326,10 +1402,10 @@ int HTTP_ContentSendFromFile(httpRequest *request, int filedes)
{
int bytes_sent;
int n_bytes;
- char buffer[4096];
+ char buffer[4098];
bytes_sent = 0;
- while((n_bytes = read(filedes, buffer,4096)) > 0)
+ while((n_bytes = read(filedes, buffer,4098)) > 0)
{
HTTP_Write(request, buffer, n_bytes);
bytes_sent += n_bytes;
@@ -1344,6 +1420,74 @@ int HTTP_ContentSendFromFile(httpRequest *request, int filedes)
}
+
+ /*@@
+ @routine AboutPage
+ @date Sun Sep 17 2000
+ @author Gabrielle Allen
+ @desc
+ Displays a page about the web server
+ @enddesc
+ @calls
+ @calledby
+@@*/
+static int AboutPage(cGH *cctkGH, httpRequest *request, void *data)
+{
+ int retval;
+ char message[4098];
+
+ /* Status message */
+ strcpy(message,"HTTP/1.0 200 OK\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Content-Type */
+ strcpy(message,"Content-Type: text/html\r\n\r\n");
+
+ HTTP_Write(request, message, strlen(message));
+
+ /* Start the page */
+ strcpy(message, "<HTML><HEAD><TITLE>About Cactus Server</TITLE></HEAD>\n");
+ HTTP_ContentHeader(0,4098,message);
+ strcat(message,"<BODY>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<center>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<h1>About this Web Server</h1>");
+ HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "</center><p>These web pages are served by a simulation "
+ "which is using the Cactus Code and Computational ToolKit, "
+ "a freely available, parallel, collaborative,"
+ " portable and "
+ "modular programming environment for HPC.</p>"
+ "<p>The HTTPD module, or <i>thorn</i> "
+ "which is serving these pages"
+ " can be added to any Cactus application to provide on-line "
+ "monitoring and control of simulations from any web browser.</p>"
+ "<p>This HTTPD server and thorn interface has been designed and "
+ "and implemented by Tom Goodale, based on the original idea and "
+ "implementation by Werner Benger.</p>");
+
+ retval = HTTP_Write(request, message, strlen(message));
+
+ strcpy(message, "<p>For more information about Cactus, visit our "
+ "permanent home page at "
+ "<a href=\"http://www.cactuscode.org\">www.cactuscode.org</a></p>");
+
+ retval = HTTP_Write(request, message, strlen(message));
+
+ /* Write out the footer part. */
+
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
+
+ return retval;
+}
+
+
/*@@
@routine CookieTestPage
@date Mon Sep 18 23:28:19 2000
@@ -1387,7 +1531,10 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data)
/* Start the page */
strcpy(message, "<HTML><HEAD><TITLE>Cookie Test</TITLE>\n");
- strcat(message, cactus_header);
+ HTTP_Write(request, message, strlen(message));
+
+ HTTP_ContentHeader(0,4098,message);
+ HTTP_Write(request, message, strlen(message));
strcat(message, "<center><h1>Cookie Test</h1></center>");
@@ -1415,7 +1562,8 @@ static int CookieTestPage(cGH *cctkGH, httpRequest *request, void *data)
/* Write out the footer part. */
- retval = HTTP_Write(request, cactus_footer, strlen(cactus_footer));
+ HTTP_ContentFooter(0,4098,message);
+ retval = HTTP_Write(request, message, strlen(message));
return retval;
}