From a3be8d36fec2ca5b36fe85a628d9862e30577fad Mon Sep 17 00:00:00 2001 From: Mingli Date: Mon, 24 Dec 2012 09:57:35 +0800 Subject: [PATCH] frame scoping in jwsgi --- plugins/jwsgi/jwsgi_plugin.c | 178 +++++++++++++++++++++-------------- 1 file changed, 108 insertions(+), 70 deletions(-) diff --git a/plugins/jwsgi/jwsgi_plugin.c b/plugins/jwsgi/jwsgi_plugin.c index 57cb555f..1f2fee51 100644 --- a/plugins/jwsgi/jwsgi_plugin.c +++ b/plugins/jwsgi/jwsgi_plugin.c @@ -3,6 +3,8 @@ extern struct uwsgi_server uwsgi; extern struct uwsgi_jvm ujvm; +static int MAX_LREFS = 16; + void uwsgi_jwsgi_init(void) { @@ -10,108 +12,144 @@ void uwsgi_jwsgi_init(void) { int uwsgi_jwsgi_request(struct wsgi_request *wsgi_req) { - jmethodID jmid; - int i; - jobject env; - jobject hkey, hval; - jobject response; + jmethodID jmid; + int i; + jobject env; + jobject hkey, hval; + jobject fdkey, fdval; + jobject response; - jobject status; - jobject headers, header; - jobject body; + jobject status; + jobject headers, header; + jobject body; - jclass hc; + const char* body_str; + const char* status_str; + const char* hkey_str; + const char* hval_str; - jmethodID hh_size, hh_get; - int hlen; + jclass hc; - if (!wsgi_req->uh.pktsize) { + jmethodID hh_size, hh_get; + int hlen; + + if (!wsgi_req->uh.pktsize) { uwsgi_log("Invalid JWSGI request. skip.\n"); return -1; } - if (uwsgi_parse_vars(wsgi_req)) { uwsgi_log("Invalid JWSGI request. skip.\n"); return -1; } - - jmid = uwsgi_jvm_get_static_method_id(ujvm.main_class, "jwsgi", "(Ljava/util/Hashtable;)[Ljava/lang/Object;"); - - uwsgi_log("jwsgi method id = %d\n", jmid); - - env = uwsgi_jvm_ht_new(); - uwsgi_jvm_exception(); - - for(i=0;ivar_cnt;i++) { - - uwsgi_jvm_ht_put(env, - uwsgi_jvm_str_new(wsgi_req->hvec[i].iov_base, wsgi_req->hvec[i].iov_len), - uwsgi_jvm_str_new(wsgi_req->hvec[i+1].iov_base, wsgi_req->hvec[i+1].iov_len) - ); - - // check if something is going wrong during hashtable fill - uwsgi_jvm_exception(); - - i++; + if ((*ujvm.env)->PushLocalFrame(ujvm.env, MAX_LREFS) < 0) { + uwsgi_log("jwsgi can not allocate frame!"); + return -1; } - uwsgi_log("env created\n"); - - uwsgi_jvm_ht_put(env, uwsgi_jvm_str("jwsgi.input"), uwsgi_jvm_fd(wsgi_req->poll.fd)); + jmid = uwsgi_jvm_get_static_method_id(ujvm.main_class, "jwsgi", "(Ljava/util/Hashtable;)[Ljava/lang/Object;"); - uwsgi_log("jwsgi.input created\n"); - - response = (*ujvm.env)->CallObjectMethod(ujvm.env, ujvm.main_class, jmid, env); - uwsgi_jvm_exception(); + uwsgi_log("jwsgi method id = %d\n", jmid); - uwsgi_log("RESPONSE SIZE %d\n", (*ujvm.env)->GetArrayLength(ujvm.env, response)); + env = uwsgi_jvm_ht_new(); + uwsgi_jvm_exception(); - status = uwsgi_jvm_array_get(response, 0); - uwsgi_jvm_exception(); + int cnt = wsgi_req->var_cnt; + for(i=0;iheaders_size += write(wsgi_req->poll.fd, wsgi_req->protocol, wsgi_req->protocol_len); - wsgi_req->headers_size += write(wsgi_req->poll.fd, " ", 1); - wsgi_req->headers_size += write(wsgi_req->poll.fd, uwsgi_jvm_str2c(status), uwsgi_jvm_strlen2c(status)); - wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); + if ((*ujvm.env)->PushLocalFrame(ujvm.env, MAX_LREFS) < 0) { + uwsgi_log("jwsgi can not allocate frame!"); + return -1; + } - - headers = uwsgi_jvm_array_get(response, 1); - hc = uwsgi_jvm_get_object_class(headers); - hh_size = uwsgi_jvm_get_method_id(hc, "size","()I"); - hh_get = uwsgi_jvm_get_method_id(hc, "get","(I)Ljava/lang/Object;"); + hkey = uwsgi_jvm_str_new(wsgi_req->hvec[i].iov_base, wsgi_req->hvec[i].iov_len); + hval = uwsgi_jvm_str_new(wsgi_req->hvec[i+1].iov_base, wsgi_req->hvec[i+1].iov_len); + uwsgi_jvm_ht_put(env, hkey, hval); + uwsgi_jvm_exception(); - hlen = (*ujvm.env)->CallIntMethod(ujvm.env, headers, hh_size); + (*ujvm.env)->PopLocalFrame(ujvm.env, NULL); - for(i=0;iCallObjectMethod(ujvm.env, headers, hh_get, i); - hkey = uwsgi_jvm_array_get(header, 0); - hval = uwsgi_jvm_array_get(header, 1); + i++; + } - wsgi_req->headers_size += write(wsgi_req->poll.fd, uwsgi_jvm_str2c(hkey), uwsgi_jvm_strlen2c(hkey)); - wsgi_req->headers_size += write(wsgi_req->poll.fd, ": ", 2); - wsgi_req->headers_size += write(wsgi_req->poll.fd, uwsgi_jvm_str2c(hval), uwsgi_jvm_strlen2c(hval)); - wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); - } + uwsgi_log("env created\n"); - wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); + uwsgi_jvm_ht_put(env, uwsgi_jvm_str("jwsgi.input"), uwsgi_jvm_fd(wsgi_req->poll.fd)); - body = uwsgi_jvm_array_get(response, 2); + uwsgi_log("jwsgi.input created\n"); - wsgi_req->response_size = write(wsgi_req->poll.fd, (*ujvm.env)->GetStringUTFChars(ujvm.env, body, NULL), (*ujvm.env)->GetStringUTFLength(ujvm.env, body)); + response = (*ujvm.env)->CallObjectMethod(ujvm.env, ujvm.main_class, jmid, env); + uwsgi_jvm_exception(); - return 1; + uwsgi_log("RESPONSE SIZE %d\n", (*ujvm.env)->GetArrayLength(ujvm.env, response)); + + + if ((*ujvm.env)->PushLocalFrame(ujvm.env, MAX_LREFS) < 0) { + uwsgi_log("jwsgi can not allocate frame!"); + return -1; + } + + status = uwsgi_jvm_array_get(response, 0); + uwsgi_jvm_exception(); + + status_str = uwsgi_jvm_str2c(status); + wsgi_req->headers_size += write(wsgi_req->poll.fd, wsgi_req->protocol, wsgi_req->protocol_len); + wsgi_req->headers_size += write(wsgi_req->poll.fd, " ", 1); + wsgi_req->headers_size += write(wsgi_req->poll.fd, status_str, uwsgi_jvm_strlen2c(status)); + wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); + (*ujvm.env)->ReleaseStringUTFChars(ujvm.env, status, status_str); + + headers = uwsgi_jvm_array_get(response, 1); + + hc = uwsgi_jvm_get_object_class(headers); + hh_size = uwsgi_jvm_get_method_id(hc, "size","()I"); + hh_get = uwsgi_jvm_get_method_id(hc, "get","(I)Ljava/lang/Object;"); + + hlen = (*ujvm.env)->CallIntMethod(ujvm.env, headers, hh_size); + + for(i=0;iPushLocalFrame(ujvm.env, MAX_LREFS) < 0) { + uwsgi_log("jwsgi can not allocate frame!"); + return -1; + } + + header = (*ujvm.env)->CallObjectMethod(ujvm.env, headers, hh_get, i); + hkey = uwsgi_jvm_array_get(header, 0); + hval = uwsgi_jvm_array_get(header, 1); + + wsgi_req->headers_size += write(wsgi_req->poll.fd, uwsgi_jvm_str2c(hkey), uwsgi_jvm_strlen2c(hkey)); + wsgi_req->headers_size += write(wsgi_req->poll.fd, ": ", 2); + wsgi_req->headers_size += write(wsgi_req->poll.fd, uwsgi_jvm_str2c(hval), uwsgi_jvm_strlen2c(hval)); + wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); + + (*ujvm.env)->PopLocalFrame(ujvm.env, NULL); + + } + + wsgi_req->headers_size += write(wsgi_req->poll.fd, "\r\n", 2); + + body = uwsgi_jvm_array_get(response, 2); + + body_str = (*ujvm.env)->GetStringUTFChars(ujvm.env, body, NULL); + wsgi_req->response_size = write(wsgi_req->poll.fd, body_str, (*ujvm.env)->GetStringUTFLength(ujvm.env, body)); + + (*ujvm.env)->PopLocalFrame(ujvm.env, NULL); + + (*ujvm.env)->PopLocalFrame(ujvm.env, NULL); + + return 1; } void uwsgi_jwsgi_after_request(struct wsgi_request *wsgi_req) { - log_request(wsgi_req); + log_request(wsgi_req); } struct uwsgi_plugin jwsgi_plugin = { - .name = "jwsgi", - .modifier1 = 8, - .request = uwsgi_jwsgi_request, - .after_request = uwsgi_jwsgi_after_request, + .name = "jwsgi", + .modifier1 = 8, + .request = uwsgi_jwsgi_request, + .after_request = uwsgi_jwsgi_after_request, };