📄 webserver.c
字号:
break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); sprintf(buf, "<html>value=%d</html>", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK;}/******************************************************************************\ * * Example dynamic HTTP POST multipart/form-data form-based calculator *\******************************************************************************/int f__form1(struct soap *soap){ int o = 0, a = 0, b = 0, val; char buf[256]; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': val = a + b; break; case 's': val = a - b; break; case 'm': val = a * b; break; case 'd': val = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } soap_response(soap, SOAP_HTML); sprintf(buf, "<html>value=%d</html>", val); soap_send(soap, buf); soap_end_send(soap); return SOAP_OK;}int f__form2(struct soap *soap, struct f__formResponse *response){ int o = 0, a = 0, b = 0; struct soap_multipart *content; for (content = soap->mime.list; content; content = content->next) { if (content->id && content->ptr) { /* may have to check content->encoding to convert data when necessary! */ if (!strcmp(content->id, "o")) o = content->ptr[0]; else if (!strcmp(content->id, "a")) a = strtol(content->ptr, NULL, 10); else if (!strcmp(content->id, "b")) b = strtol(content->ptr, NULL, 10); } } switch (o) { case 'a': response->result = a + b; break; case 's': response->result = a - b; break; case 'm': response->result = a * b; break; case 'd': response->result = a / b; break; default: return soap_sender_fault(soap, "Unknown operation", NULL); } return SOAP_OK;}/******************************************************************************\ * * Dynamic Web server info page *\******************************************************************************/int info(struct soap *soap){ struct http_get_data *getdata; struct logging_data *logdata; const char *t0, *t1, *t2, *t3, *t4, *t5, *t6, *t7; char buf[2048]; /* buffer large enough to hold HTML content */ struct soap_plugin *p; time_t now = time(NULL), elapsed = now - start; query_options(soap, options); if (soap->omode & SOAP_IO_KEEPALIVE) t0 = "<td align='center' bgcolor='green'>YES</td>"; else t0 = "<td align='center' bgcolor='red'>NO</td>";#ifdef WITH_COOKIES t1 = "<td align='center' bgcolor='green'>YES</td>"; /* soap_env_cookie_value() returns value of a cookie received (from client) */ if (soap_env_cookie_value(soap, "visit", NULL, NULL)) t2 = "<td align='center' bgcolor='green'>PASS</td>"; else t2 = "<td align='center' bgcolor='yellow'>WAIT</td>";#else t1 = "<td align='center' bgcolor='red'>NO</td>"; t2 = "<td align='center' bgcolor='blue'>N/A</td>";#endif if (secure) { t3 = "<td align='center' bgcolor='green'>YES</td>"; if (soap->imode & SOAP_ENC_SSL) t4 = "<td align='center' bgcolor='green'>PASS</td>"; else t4 = "<td align='center' bgcolor='red'><blink>FAIL</blink></td>"; } else { t3 = "<td align='center' bgcolor='red'>NO</td>"; t4 = "<td align='center' bgcolor='blue'>N/A</td>"; }#ifdef WITH_ZLIB if (options[OPTION_z].selected) { t5 = "<td align='center' bgcolor='green'>YES</td>"; if (soap->omode & SOAP_ENC_ZLIB) t6 = "<td align='center' bgcolor='green'>PASS</td>"; else t6 = "<td align='center' bgcolor='yellow'>WAIT</td>"; } else { t5 = "<td align='center' bgcolor='red'>NO</td>"; t6 = "<td align='center' bgcolor='blue'>N/A</td>"; }#else t5 = "<td align='center' bgcolor='red'>NO</td>"; t6 = "<td align='center' bgcolor='blue'>N/A</td>";#endif if (options[OPTION_c].selected || (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) t7 = "<td align='center' bgcolor='green'>YES</td>"; else t7 = "<td align='center' bgcolor='red'>NO</td>"; if (soap_response(soap, SOAP_HTML)) return soap->error; sprintf(buf, "\<html>\<head>\<meta name='Author' content='Robert A. van Engelen'>\<meta name='Generator' content='gSOAP'>\<meta http-equiv='Refresh' content='60'>\<style type='text/css' media='screen'><!-- table { background-color: #666 } td { color: white; font-size: 10px; line-height: 10px; font-family: Arial, Helvetica, Geneva, Swiss, SunSans-Regular } --></style>\<title>gSOAP Web Server Administration</title>\</head>\<body bgcolor='#FFFFFF'>\<h1>gSOAP Web Server Administration</h1>\<p>Server endpoint=%s client agent IP=%d.%d.%d.%d\<h2>Registered Plugins</h2>\", soap->endpoint, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF); if (soap_send(soap, buf)) return soap->error; for (p = soap->plugins; p; p = p->next) { sprintf(buf, "%s<br>", p->id); if (soap_send(soap, buf)) return soap->error; } if (soap_send(soap, "<h2>Elapsed Time</h2>")) return soap->error; if (elapsed >= 86400) html_hbar(soap, "Days:", 100, elapsed/86400, 0x000000); if (elapsed >= 3600) html_hbar(soap, "Hours:", 100, elapsed/3600%24, 0x000000); html_hbar(soap, "Minutes:", 100, elapsed/60%60, 0x000000); soap_send(soap, "<h2>Control Panel</h2>"); if (html_form_options(soap, options)) return soap->error; sprintf(buf, "\<h2>Function Tests</h2>\<table border='0' cellspacing='0' cellpadding='0' bgcolor='#666666' nosave>\<tr height='10'><td height='10' background='bl.gif'></td><td height='10'><i>Function</i></td><td align='center' height='10'><i>Result</i></td><td height='10' background='obls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP operational</td><td align='center' bgcolor='green'>YES</td><td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP keep alive enabled</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP cookies enabled</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP cookies test</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTPS (OpenSSL) enabled</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTPS (OpenSSL) test</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP compression enabled</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP compression test</td>%s<td width='10' background='ls.gif'></td></tr>\<tr><td background='bl.gif'></td><td>HTTP chunking enabled</td>%s<td width='10' background='ls.gif'></td></tr>\<tr height='10'><td width='10' height='10' background=otrs.gif></td><td height='10' background='ts.gif'></td><td height='10' background='ts.gif'></td><td width='10' height='10' background='otls.gif'></td></tr>\</table>", t0, t1, t2, t3, t4, t5, t6, t7); if (soap_send(soap, buf)) return soap->error; getdata = (struct http_get_data*)soap_lookup_plugin(soap, http_get_id); logdata = (struct logging_data*)soap_lookup_plugin(soap, logging_id); soap_send(soap, "<h2>Usage Statistics</h2>"); if (getdata) { html_hbar(soap, "HTTP GET", 120, getdata->stat_get, 0x0000FF); html_hbar(soap, "HTTP POST", 120, getdata->stat_post, 0x00FF00); html_hbar(soap, "HTTP FAIL", 120, getdata->stat_fail, 0xFF0000); } if (logdata) { html_hbar(soap, "SENT(kB)", 120, logdata->stat_sent/1024, 0x00FFFF); html_hbar(soap, "RECV(kB)", 120, logdata->stat_recv/1024, 0x00FFFF); if (elapsed > 0) { html_hbar(soap, "SENT(kB/s)", 120, logdata->stat_sent/elapsed/1024, 0x00FFFF); html_hbar(soap, "RECV(kB/s)", 120, logdata->stat_recv/elapsed/1024, 0x00FFFF); } } if (getdata) { struct tm T; T.tm_min = 99; T.tm_hour = 99; T.tm_yday = 999;#ifdef HAVE_LOCALTIME_R localtime_r(&now, &T);#else T = *localtime(&now);#endif soap_send(soap, "<h2>Requests by the Minute</h2>"); html_hist(soap, "Minute", 12, 0, 60, minutes, getdata->min, T.tm_min); soap_send(soap, "<h2>Requests by the Hour</h2>"); html_hist(soap, "Hour", 30, 0, 24, hours, getdata->hour, T.tm_hour); soap_send(soap, "<h2>Requests by Day of the Year</h2>"); html_hist(soap, "Day", 2, 0, 365, NULL, getdata->day, T.tm_yday); } soap_send(soap, "\<p>This page will automatically reload every minute to refresh the statistics.\<br><br><br><img src='favicon.gif' align='absmiddle'>Powered by gSOAP\</body>\</HTML>"); return soap_end_send(soap);}static size_t html_scaled(char *buf, size_t len){ if (len > 1000000) { sprintf(buf, "%.2f·10<sup>6</sup>", (float)len/1000000.0); return len / 1000000; } if (len > 1000) { sprintf(buf, "%.2f·10<sup>3</sup>", (float)len/1000.0); return len / 1000; } sprintf(buf, "%lu", (unsigned long)len); return len;}int html_hbar(struct soap *soap, const char *title, size_t pix, size_t len, unsigned long color){ char buf[2048]; /* buffer large enough to hold HTML content */ char lab[32]; len = html_scaled(lab, len); sprintf(buf, "\<table border='0' cellspacing='0' cellpadding='0' height='30'>\<tr height='10'>\<td width='10' height='10' background='bl.gif'></td>\<td rowspan='2' bgcolor='#666666' width='%lu' height='20'>%s %s</td>\<td bgcolor='#%.6lx' width='%lu' height='10'></td>\<td width='10' height='10' background='obls.gif'></td>\</tr>\<tr height='10'>\<td width='10' height='10' background='bl.gif'></td>\<td height='10' background='ruler.gif'></td>\<td width='10' height='10' background='ls.gif'></td>\</tr>\<tr height='10'>\<td width='10' height='10' background='otrs.gif'></td>\<td colspan='2' height='10' background='ts.gif'></td>\<td width='10' height='10' background='otls.gif'></td>\</tr>\</table>", (unsigned long)pix, title ? title : "", lab, color, (unsigned long)len * 2); return soap_send(soap, buf);}int html_hist(struct soap *soap, const char *title, size_t barwidth, size_t height, size_t num, const char **key, size_t *val, size_t highlight){ char buf[2048]; /* buffer large enough to hold HTML content */ char lab[32]; size_t i, max; float scale; max = 0; for (i = 0; i < num; i++) { if (val[i] > max) max = val[i]; } if (height < 20) { height = max; if (height < 20) height = 20; else if (height > 256) height = 256; } scale = (float)height / (float)max; html_scaled(lab, max); sprintf(buf, "\<a name='%s'></a>\<table bgcolor='#FFFFFF' border='0' cellspacing='0' cellpadding='0' height='%lu' align='center'>\<tr height='10'>\<td width='10' height='10' background='btl.gif'></td><td colspan='%lu' height='10' background='bt.gif'></td><td width='10' height='10' background='btr.gif'></td><td width='10' height='10' background='obls.gif'></td>\</tr>\<tr height='%lu' align='center' valign='bottom'>\<td width='10' height='%lu' background='bl.gif'></td>\<td bgcolor='#666666' valign='top'>%s</td>", title ? title : "", (unsigned long)height + 50, (unsigned long)num + 1, (unsigned long)height, (unsigned long)height, lab); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { unsigned long bar = (scale * val[i] + 0.5); if (bar >= 1) sprintf(buf, "\<td bgcolor='#FFFFFF'><a onmouseover=\"window.status='%lu';return true\" onmouseout=\"window.status='';return true\" href='#%s'><img src='top.gif' alt='' width='%lu' height='1' align='bottom' border='0'><br><img src='bar.gif' alt='' width='%lu' height='%lu' align='bottom' border='0'></a></td>", (unsigned long)i, title ? title : "", (unsigned long)barwidth, (unsigned long)barwidth, bar - 1); else sprintf(buf, "\<td bgcolor='#FFFFFF'><img src='bar.gif' alt='' width='%lu' height='0' align='bottom' border='0'></td>", (unsigned long)barwidth); if (soap_send(soap, buf)) return soap->error; } sprintf(buf, "\<td width='10' height='%lu' background='br.gif'></td>\<td width='10' height='%lu' background='ls.gif'></td>\</tr>\<tr bgcolor='#666666' height='20' align='center'>\<td width='10' height='20' background='bl.gif'></td>\<td bgcolor='#666666'>%s</td>", (unsigned long)height, (unsigned long)height, title ? title : ""); if (soap_send(soap, buf)) return soap->error; for (i = 0; i < num; i++) { sprintf(buf, "<td%s>%s</td>", (i == highlight) ? " bgcolor='#777777'" : "", key ? key[i] : "<img src='bar.gif'>"); if (soap_send(soap, buf)) return soap->error; } if (soap_send(soap, "\<td width='10' height='20' background='br.gif'></td>\<td width='10' height='20' background='ls.gif'></td>")) return soap->error; sprintf(buf, "\</tr>\<tr height='10'>\<td width='10' height='10' background='bbl.gif'></td><td colspan='%lu' height='10' background='bb.gif'></td><td width='10' height='10' background='bbr.gif'></td><td width='10' height='10' background='ls.gif'></td>\</tr>\<tr height='10'>\<td width='10' height='10' background='otrs.gif'></td>\<td colspan='%lu' height='10' background='ts.gif'></td>\<td width='10' height='10' background='otls.gif'></td>\</tr>\</table>", (unsigned long)num + 1, (unsigned long)num + 2); return soap_send(soap, buf);}/******************************************************************************\ * * OpenSSL *\******************************************************************************/#ifdef WITH_OPENSSLstruct CRYPTO_dynlock_value{ MUTEX_TYPE mutex;};static MUTEX_TYPE *mutex_buf;static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line){ struct CRYPTO_dynlock_value *value; value = (struct CRYPTO_dynlock_value*)malloc(sizeof(struct CRYPTO_dynlock_value)); if (value) MUTEX_SETUP(value->mutex); return value;}static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line){ if (mode & CRYPTO_LOCK) MUTEX_LOCK(l->mutex); else MUTEX_UNLOCK(l->mutex);}static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line){ MUTEX_CLEANUP(l->mutex); free(l);}void locking_function(int mode, int n, const char *file, int line){ if (mode & CRYPTO_LOCK) MUTEX_LOCK(mutex_buf[n]); else MUTEX_UNLOCK(mutex_buf[n]);}unsigned long id_function(){ return (unsigned long)THREAD_ID;}int CRYPTO_thread_setup(){ int i; mutex_buf = (MUTEX_TYPE*)malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); if (!mutex_buf) return SOAP_EOM; for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_SETUP(mutex_buf[i]); CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(locking_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return SOAP_OK;}void CRYPTO_thread_cleanup(){ int i; if (!mutex_buf) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); for (i = 0; i < CRYPTO_num_locks(); i++) MUTEX_CLEANUP(mutex_buf[i]); free(mutex_buf); mutex_buf = NULL;}#endif/******************************************************************************\ * * SIGPIPE *\******************************************************************************/void sigpipe_handle(int x) { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -