summaryrefslogtreecommitdiffstats
path: root/libcsoap/soap-admin.c
blob: 1ee9db5c8ffc1cf8301c00014847e4432ff29a1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#define SOAP_ADMIN_QUERY_ROUTERS "routers"
#define SOAP_ADMIN_QUERY_ROUTER "router"
#define SOAP_ADMIN_QUERY_SERVICES "services"


static void
_soap_admin_send_title(httpd_conn_t* conn, const char* title)
{
  httpd_send_header(conn, 200, "OK");
  http_output_stream_write_string(conn->out,
   "<html><head><style>");
  http_output_stream_write_string(conn->out,
   ".logo {"
   " color: #005177;"
   " background-color: transparent;"
   " font-family: Calligraphic, arial, sans-serif;"
   " font-size: 36px;"
   "}");
  http_output_stream_write_string(conn->out,
   "</style></head><body><span class=\"logo\">csoap</span> ");
  http_output_stream_write_string(conn->out, title);
  http_output_stream_write_string(conn->out, "<hr />");
}


static void
_soap_admin_list_routers(httpd_conn_t* conn)
{
  SoapRouterNode *node;
  char buffer[1024];

  _soap_admin_send_title(conn, "Available routers");

  for (node = head; node; node = node->next)
  {
    sprintf(buffer, "<li /> <a href=\"?" SOAP_ADMIN_QUERY_ROUTER "=%s\"> %s",
	    node->context, node->context);
    http_output_stream_write_string(conn->out, buffer);
  }
  
  http_output_stream_write_string(conn->out, "</body></html>");
}

static void
_soap_admin_list_services(httpd_conn_t* conn, const char* routername)
{
  SoapRouter *router;
  SoapServiceNode *node;
  char buffer[1024];
  
  sprintf(buffer, "Listing Services for Router <b>%s</b>", routername);
  _soap_admin_send_title(conn, buffer);

  router = router_find(routername);
  if (!router) {
    http_output_stream_write_string(conn->out, "Router not found!");
    http_output_stream_write_string(conn->out, "</body></html>");
    return;
  }

  node = router->service_head;

  while (node) {
    sprintf(buffer, "<li /> [%s] (%s)",
	    node->service->urn,
	    node->service->method);
    http_output_stream_write_string(conn->out, buffer);
    node = node->next;
  }

  http_output_stream_write_string(conn->out, "</body></html>");
}



static void
_soap_admin_handle_get(httpd_conn_t * conn, hrequest_t * req)
{
  char *param;

  if ((param = hpairnode_get_ignore_case(req->query, SOAP_ADMIN_QUERY_ROUTERS))) {
    _soap_admin_list_routers(conn);
  } else if ((param = hpairnode_get_ignore_case(req->query, SOAP_ADMIN_QUERY_ROUTER))) {
    _soap_admin_list_services(conn, param);
  } else {
    _soap_admin_send_title(conn, "Welcome to the admin site");
    http_output_stream_write_string(conn->out,
     "<li /> <a href=\"?" SOAP_ADMIN_QUERY_ROUTERS "\"> Routers </a>");
    http_output_stream_write_string(conn->out,
     "</body></html>");
  }
}

static void
_soap_admin_entry(httpd_conn_t * conn, hrequest_t * req)
{
  if (req->method == HTTP_REQUEST_GET) {
    _soap_admin_handle_get(conn, req);
  } else {
    httpd_send_header(conn, 200, "OK");
    http_output_stream_write_string(conn->out,
              "<html>"
                  "<head>"
		  "</head>"
		  "<body>"
                      "<h1>Sorry!</h1>"
                      "<hr />"
                      "<div>POST Service is not implemented now. Use your browser</div>"
                  "</body>"
              "</html>");
  }
}