154 lines
3.6 KiB
C
154 lines
3.6 KiB
C
|
|
/*
|
|
* Copyright (C) NGINX, Inc.
|
|
*/
|
|
|
|
#include <nxt_auto_config.h>
|
|
|
|
#include <nxt_unit.h>
|
|
#include <nxt_unit_request.h>
|
|
#include <jni.h>
|
|
#include <stdio.h>
|
|
|
|
#include "nxt_jni.h"
|
|
#include "nxt_jni_URLClassLoader.h"
|
|
#include "nxt_jni_HeaderNamesEnumeration.h"
|
|
|
|
|
|
static jlong JNICALL nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env,
|
|
jclass cls, jlong headers_ptr, jlong size, jlong pos);
|
|
static jstring JNICALL nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env,
|
|
jclass cls, jlong headers_ptr, jlong size, jlong pos);
|
|
|
|
|
|
static jclass nxt_java_HeaderNamesEnumeration_class;
|
|
static jmethodID nxt_java_HeaderNamesEnumeration_ctor;
|
|
|
|
|
|
int
|
|
nxt_java_initHeaderNamesEnumeration(JNIEnv *env, jobject cl)
|
|
{
|
|
int res;
|
|
jclass cls;
|
|
|
|
cls = nxt_java_loadClass(env, cl, "nginx.unit.HeaderNamesEnumeration");
|
|
if (cls == NULL) {
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
nxt_java_HeaderNamesEnumeration_class = (*env)->NewGlobalRef(env, cls);
|
|
(*env)->DeleteLocalRef(env, cls);
|
|
cls = nxt_java_HeaderNamesEnumeration_class;
|
|
|
|
nxt_java_HeaderNamesEnumeration_ctor = (*env)->GetMethodID(env, cls,
|
|
"<init>", "(JJ)V");
|
|
if (nxt_java_HeaderNamesEnumeration_ctor == NULL) {
|
|
(*env)->DeleteGlobalRef(env, cls);
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
JNINativeMethod hnenum_methods[] = {
|
|
{ (char *) "nextElementPos",
|
|
(char *) "(JJJ)J",
|
|
nxt_java_HeaderNamesEnumeration_nextElementPos },
|
|
|
|
{ (char *) "nextElement",
|
|
(char *) "(JJJ)Ljava/lang/String;",
|
|
nxt_java_HeaderNamesEnumeration_nextElement },
|
|
};
|
|
|
|
res = (*env)->RegisterNatives(env, nxt_java_HeaderNamesEnumeration_class,
|
|
hnenum_methods,
|
|
sizeof(hnenum_methods)
|
|
/ sizeof(hnenum_methods[0]));
|
|
|
|
nxt_unit_debug(NULL, "registered HeaderNamesEnumeration methods: %d", res);
|
|
|
|
if (res != 0) {
|
|
(*env)->DeleteGlobalRef(env, cls);
|
|
return NXT_UNIT_ERROR;
|
|
}
|
|
|
|
return NXT_UNIT_OK;
|
|
}
|
|
|
|
|
|
jobject
|
|
nxt_java_newHeaderNamesEnumeration(JNIEnv *env, nxt_unit_field_t *f,
|
|
uint32_t fields_count)
|
|
{
|
|
return (*env)->NewObject(env,
|
|
nxt_java_HeaderNamesEnumeration_class,
|
|
nxt_java_HeaderNamesEnumeration_ctor, nxt_ptr2jlong(f),
|
|
(jlong) fields_count);
|
|
}
|
|
|
|
|
|
static jlong JNICALL
|
|
nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env, jclass cls,
|
|
jlong headers_ptr, jlong size, jlong pos)
|
|
{
|
|
nxt_unit_field_t *f;
|
|
|
|
f = nxt_jlong2ptr(headers_ptr);
|
|
|
|
if (pos >= size) {
|
|
return size;
|
|
}
|
|
|
|
if (pos > 0) {
|
|
while (pos < size
|
|
&& f[pos].hash == f[pos - 1].hash
|
|
&& f[pos].name_length == f[pos - 1].name_length)
|
|
{
|
|
pos++;
|
|
}
|
|
}
|
|
|
|
return pos;
|
|
}
|
|
|
|
|
|
static jstring JNICALL
|
|
nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env, jclass cls,
|
|
jlong headers_ptr, jlong size, jlong pos)
|
|
{
|
|
char *name, tmp;
|
|
jstring res;
|
|
nxt_unit_field_t *f;
|
|
|
|
f = nxt_jlong2ptr(headers_ptr);
|
|
|
|
if (pos > 0) {
|
|
while (pos < size
|
|
&& f[pos].hash == f[pos - 1].hash
|
|
&& f[pos].name_length == f[pos - 1].name_length)
|
|
{
|
|
pos++;
|
|
}
|
|
}
|
|
|
|
if (pos >= size) {
|
|
nxt_java_throw_NoSuchElementException(env, "pos >= size");
|
|
|
|
return NULL;
|
|
}
|
|
|
|
f += pos;
|
|
|
|
name = nxt_unit_sptr_get(&f->name);
|
|
tmp = name[f->name_length];
|
|
|
|
if (tmp != '\0') {
|
|
name[f->name_length] = '\0';
|
|
}
|
|
|
|
res = (*env)->NewStringUTF(env, name);
|
|
|
|
if (tmp != '\0') {
|
|
name[f->name_length] = tmp;
|
|
}
|
|
|
|
return res;
|
|
}
|