⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserver.c

📁 linux下简单对象应用协议的开发库
💻 C
📖 第 1 页 / 共 3 页
字号:
      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&nbsp;GET", 120, getdata->stat_get, 0x0000FF);    html_hbar(soap, "HTTP&nbsp;POST", 120, getdata->stat_post, 0x00FF00);    html_hbar(soap, "HTTP&nbsp;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&#183;10<sup>6</sup>", (float)len/1000000.0);    return len / 1000000;  }  if (len > 1000)  { sprintf(buf, "%.2f&#183;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&nbsp;%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 + -