From cbbaa24d6e5d69a0528a5d5d4e4d98be676b7390 Mon Sep 17 00:00:00 2001 From: Unbit Date: Wed, 6 Mar 2013 14:44:49 +0100 Subject: [PATCH] completetd uwsgi.RequestBody jvm implementation --- plugins/jvm/jvm.h | 2 ++ plugins/jvm/jvm_plugin.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/plugins/jvm/jvm.h b/plugins/jvm/jvm.h index 52682d47..cfbde598 100644 --- a/plugins/jvm/jvm.h +++ b/plugins/jvm/jvm.h @@ -94,3 +94,5 @@ int uwsgi_jvm_call_bool(jobject, jmethodID, ...); int uwsgi_jvm_consume_input_stream(struct wsgi_request *, size_t, jobject); jobject uwsgi_jvm_num(long); jobject uwsgi_jvm_request_body_input_stream(void); + +size_t uwsgi_jvm_array_len(jobject); diff --git a/plugins/jvm/jvm_plugin.c b/plugins/jvm/jvm_plugin.c index 063f977e..3fd4fbe2 100644 --- a/plugins/jvm/jvm_plugin.c +++ b/plugins/jvm/jvm_plugin.c @@ -67,8 +67,34 @@ JNIEXPORT jint JNICALL uwsgi_jvm_request_body_read(JNIEnv *env, jobject o) { return (jint) byte; } +JNIEXPORT jint JNICALL uwsgi_jvm_request_body_read_bytearray(JNIEnv *env, jobject o, jobject b) { + struct wsgi_request *wsgi_req = current_wsgi_req(); + ssize_t rlen = 0; + size_t len = uwsgi_jvm_array_len(b); + char *chunk = uwsgi_request_body_read(wsgi_req, len, &rlen); + if (!chunk) { + uwsgi_jvm_throw_io("error reading request body"); + return -1; + } + if (chunk == uwsgi.empty) { + return -1; + } + char *buf = (char *) (*ujvm_env)->GetByteArrayElements(ujvm_env, b, JNI_FALSE); + if (!buf) return -1; + memcpy(buf, chunk, rlen); + (*ujvm_env)->ReleaseByteArrayElements(ujvm_env, b, (jbyte *) buf, 0); + return rlen; +} + +JNIEXPORT jint JNICALL uwsgi_jvm_request_body_available(JNIEnv *env, jobject o) { + struct wsgi_request *wsgi_req = current_wsgi_req(); + return (jint) (wsgi_req->post_cl - wsgi_req->post_pos); +} + static JNINativeMethod uwsgi_jvm_request_body_methods[] = { {"read", "()I", (void *) &uwsgi_jvm_request_body_read}, + {"read", "([B)I", (void *) &uwsgi_jvm_request_body_read_bytearray}, + {"available", "()I", (void *) &uwsgi_jvm_request_body_available}, }; static struct uwsgi_option uwsgi_jvm_options[] = {