📄 protocol.cpp
字号:
return -1;
}
sublen = s->read_length - s->read_offset;
if (len < sublen)
sublen = len;
s->read_buf[s->read_length] = 0;
unsigned long writelen = sublen;
while (writelen > 0) {
unsigned long sentlen = writelen;
if (! r->WriteClient(r->ConnID, s->read_buf + s->read_offset, &sentlen, HSE_IO_SYNC) ||
sentlen <= 0) {
cse_close(s, "response");
return -1;
}
writelen -= sentlen;
}
s->read_offset += sublen;
len -= sublen;
}
return 1;
}
static int
cse_copy_results(stream_t *s, EXTENSION_CONTROL_BLOCK *r, config_t *config)
{
char headers[32 * 1024];
char status[8192];
char *status_ptr = status;
char key[8192];
char value[8192];
int code;
headers[0] = 0;
do {
int i;
int l1, l2, l3;
int read_len;
unsigned long size;
code = cse_read_byte(s);
l1 = cse_read_byte(s) & 0xff;
l2 = cse_read_byte(s) & 0xff;
l3 = cse_read_byte(s);
read_len = (l1 << 16) + (l2 << 8) + (l3 & 0xff);
if (l3 < 0 || s->socket < 0)
return -1;
LOG(("code %c(%d) %d\n", code, code, read_len));
switch (code) {
case CSE_DATA:
if (cse_write_response(s, read_len, r) < 0)
code = -1;
break;
case CSE_STATUS:
cse_read_limit(s, status, sizeof(status), read_len);
for (i = 0; status[i] && status[i] != ' '; i++) {
}
i++;
status_ptr = status + i;
break;
case CSE_HEADER:
cse_read_limit(s, key, sizeof(key), read_len);
cse_read_string(s, value, sizeof(value));
strcat(headers, key);
strcat(headers, ": ");
strcat(headers, value);
strcat(headers, "\r\n");
break;
case CSE_SEND_HEADER:
strcat(headers, "\r\n");
size = strlen(headers);
r->ServerSupportFunction(r->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, status_ptr, &size, (unsigned long *) headers);
break;
default:
if (code < 0 || read_len < 0 || read_len > 8192) {
code = -1;
break;
}
cse_skip(s, read_len);
break;
}
} while (code > 0 && code != CSE_END && code != CSE_ACK && code != CSE_CLOSE);
return code;
}
static void
cse_get_ip(EXTENSION_CONTROL_BLOCK *r, char *ip, unsigned long length)
{
ip[0] = 0;
if (r->GetServerVariable(r->ConnID, "REMOTE_ADDR", ip, &length) && length >= 0)
ip[length] = 0;
else
ip[0] = 0;
}
static int
get_session_index(EXTENSION_CONTROL_BLOCK *r)
{
char buf[16384];
unsigned long i = 0;
unsigned long len = sizeof(buf);
int session;
if (r->GetServerVariable(r->ConnID, "Cookie", buf, &len)) {
session = cse_session_from_string(buf, "JSESSIONID=");
if (session >= 0)
return session;
}
// raw?
len = sizeof(buf);
buf[0] = 0;
if (! r->GetServerVariable(r->ConnID, "PATH_INFO", buf, &len))
return -1;
buf[len] = 0;
return cse_session_from_string(buf, "jsessionid=");
}
static int
get_session_from_raw(EXTENSION_CONTROL_BLOCK *r)
{
char buf[16384];
unsigned long i = 0;
unsigned long len = sizeof(buf);
int session;
if (! r->GetServerVariable(r->ConnID, "ALL_RAW", buf, &len))
return -1;
while (i < len) {
int head = i + 5;
int tail;
i = head;
for (; i < len && buf[i] != ':'; i++) {
}
tail = i;
for (i++; i < len && buf[i] != '\r' && buf[i] != '\n'; i++) {
}
if (head >= tail)
continue;
buf[tail] = 0;
buf[i] = 0;
if (stricmp(buf + head, "cookie"))
continue;
session = cse_session_from_string(buf + tail + 1, "JSESSIONID=");
if (session >= 0)
return session;
}
return -1;
}
static int
write_request(stream_t *s, EXTENSION_CONTROL_BLOCK *r, config_t *config)
{
int code;
char ip[1024];
int session_index = get_session_index(r);
int rand = 0;
DWORD request_time = GetTickCount() / 1000;
cse_get_ip(r, ip, sizeof(ip));
if (! cse_open_connection(s, config, session_index, ip,
request_time, rand, 0))
return connection_error(config, r);
int isHttp11 = write_env(s, r);
write_headers(s, r);
// read post data
char buf[BUF_LENGTH];
int isFirst = 1;
unsigned long totalLen = 0;
while (totalLen < r->cbTotalBytes) {
unsigned long len = sizeof(buf);
if (r->cbAvailable > 0) {
if (len > r->cbAvailable)
len = r->cbAvailable;
memcpy(buf, r->lpbData + totalLen, len);
r->cbAvailable -= len;
}
else if (! r->ReadClient(r->ConnID, buf, &len) || len <= 0) {
break;
}
totalLen += len;
if (! isFirst) {
code = cse_copy_results(s, r, config);
if (code < 0 || code == CSE_END || code == CSE_CLOSE)
break;
}
cse_write_packet(s, CSE_DATA, buf, len);
isFirst = 0;
}
cse_write_packet(s, CSE_END, 0, 0);
code = cse_copy_results(s, r, config);
if (code == CSE_END)
cse_recycle(s);
else
cse_close(s, "write");
return code == CSE_END || code == CSE_CLOSE;
}
static int g_count;
static void
jvm_status(config_t *config, EXTENSION_CONTROL_BLOCK *r)
{
int i;
stream_t s;
cse_printf(r, "<center><table border=2 cellspacing=0 cellpadding=2 width=\"80%%\">\n");
/*
cse_printf(r, "<tr><th>Host\n");
cse_printf(r, " <th>Minute<br>%%cpu/thread\n");
cse_printf(r, " <th>Hour<br>%%cpu/thread\n");
cse_printf(r, " <th>Day<br>%%cpu/thread\n");
*/
for (i = 0; i < config->srun_size; i++) {
srun_t *srun = config->srun_list + i;
int port = srun->port;
cse_printf(r, "<tr>");
if (! cse_open(&s, config, srun, 0, 1)) {
cse_printf(r, "<td bgcolor='#ff6666'>%s:%d%s (down)</td>",
srun->hostname ? srun->hostname : "localhost",
port, srun->is_backup ? "*" : "");
}
else {
cse_printf(r, "<td bgcolor='#66ff66'>%s:%d%s (ok)</td>",
srun->hostname ? srun->hostname : "localhost",
port, srun->is_backup ? "*" : "");
cse_recycle(&s);
continue;
}
}
cse_printf(r, "</table></center>\n");
}
static void
cse_caucho_status(config_t *config, EXTENSION_CONTROL_BLOCK *r)
{
location_t *loc;
char *headers = "200 OK\r\nContent-Type: text/html";
unsigned long size = strlen(headers);
r->ServerSupportFunction(r->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, headers, &size, 0);
cse_printf(r, "<html><title>Status : Caucho Servlet Engine</title>\n");
cse_printf(r, "<body bgcolor=white>\n");
cse_printf(r, "<h1>Status : Caucho Servlet Engine</h1>\n");
jvm_status(config, r);
cse_printf(r, "<p><center><table border=2 cellspacing=0 cellpadding=2 width=\"80%%\">\n");
cse_printf(r, "<tr><th width='50%'>Host\n");
cse_printf(r, " <th>url-pattern\n");
loc = config ? config->locations : 0;
for (; loc; loc = loc->next) {
cse_printf(r, "<tr bgcolor='#ffcc66'><td>%s<td>%s%s%s%s</tr>\n",
loc->host && loc->host[0] ? loc->host : "*",
loc->prefix,
! loc->is_exact && ! loc->suffix ? "/*" :
loc->suffix && loc->prefix[0] ? "/" : "",
loc->suffix ? "*" : "",
loc->suffix ? loc->suffix : "");
}
cse_printf(r, "</table></center>\n");
cse_printf(r, "</body></html>\n");
}
int
cse_handle_request(config_t *config, EXTENSION_CONTROL_BLOCK *r)
{
char url[8192];
char *ptr = url;
unsigned long size = sizeof(url);
url[0] = 0;
if (r->GetServerVariable(r->ConnID, "PATH_INFO", url, &size) && size > 0 && url[0]) {
url[size] = 0;
if (! strcmp(url, "/caucho-status")) {
cse_caucho_status(config, r);
return 1;
}
else if (! cse_match_request(config, "", 0, ptr))
return cse_error(config, r);
}
else
return cse_error(config, r);
stream_t s;
return write_request(&s, r, config);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -