1*977Smax.romanov@gmail.com 2*977Smax.romanov@gmail.com /* 3*977Smax.romanov@gmail.com * Copyright (C) NGINX, Inc. 4*977Smax.romanov@gmail.com */ 5*977Smax.romanov@gmail.com 6*977Smax.romanov@gmail.com #include <nxt_auto_config.h> 7*977Smax.romanov@gmail.com 8*977Smax.romanov@gmail.com #include <nxt_unit.h> 9*977Smax.romanov@gmail.com #include <nxt_unit_request.h> 10*977Smax.romanov@gmail.com #include <jni.h> 11*977Smax.romanov@gmail.com #include <stdio.h> 12*977Smax.romanov@gmail.com 13*977Smax.romanov@gmail.com #include "nxt_jni.h" 14*977Smax.romanov@gmail.com #include "nxt_jni_URLClassLoader.h" 15*977Smax.romanov@gmail.com #include "nxt_jni_HeadersEnumeration.h" 16*977Smax.romanov@gmail.com 17*977Smax.romanov@gmail.com 18*977Smax.romanov@gmail.com static jclass nxt_java_HeadersEnumeration_class; 19*977Smax.romanov@gmail.com static jmethodID nxt_java_HeadersEnumeration_ctor; 20*977Smax.romanov@gmail.com 21*977Smax.romanov@gmail.com 22*977Smax.romanov@gmail.com static jlong JNICALL nxt_java_HeadersEnumeration_nextElementPos(JNIEnv *env, 23*977Smax.romanov@gmail.com jclass cls, jlong headers_ptr, jlong size, jlong ipos, jlong pos); 24*977Smax.romanov@gmail.com 25*977Smax.romanov@gmail.com static jstring JNICALL nxt_java_HeadersEnumeration_nextElement(JNIEnv *env, 26*977Smax.romanov@gmail.com jclass cls, jlong headers_ptr, jlong size, jlong ipos, jlong pos); 27*977Smax.romanov@gmail.com 28*977Smax.romanov@gmail.com 29*977Smax.romanov@gmail.com int 30*977Smax.romanov@gmail.com nxt_java_initHeadersEnumeration(JNIEnv *env, jobject cl) 31*977Smax.romanov@gmail.com { 32*977Smax.romanov@gmail.com int res; 33*977Smax.romanov@gmail.com jclass cls; 34*977Smax.romanov@gmail.com 35*977Smax.romanov@gmail.com cls = nxt_java_loadClass(env, cl, "nginx.unit.HeadersEnumeration"); 36*977Smax.romanov@gmail.com if (cls == NULL) { 37*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 38*977Smax.romanov@gmail.com } 39*977Smax.romanov@gmail.com 40*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_class = (*env)->NewGlobalRef(env, cls); 41*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 42*977Smax.romanov@gmail.com cls = nxt_java_HeadersEnumeration_class; 43*977Smax.romanov@gmail.com 44*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_ctor = (*env)->GetMethodID(env, cls, 45*977Smax.romanov@gmail.com "<init>", "(JJJ)V"); 46*977Smax.romanov@gmail.com if (nxt_java_HeadersEnumeration_ctor == NULL) { 47*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, cls); 48*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 49*977Smax.romanov@gmail.com } 50*977Smax.romanov@gmail.com 51*977Smax.romanov@gmail.com JNINativeMethod methods[] = { 52*977Smax.romanov@gmail.com { (char *) "nextElementPos", 53*977Smax.romanov@gmail.com (char *) "(JJJJ)J", 54*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_nextElementPos }, 55*977Smax.romanov@gmail.com 56*977Smax.romanov@gmail.com { (char *) "nextElement", 57*977Smax.romanov@gmail.com (char *) "(JJJJ)Ljava/lang/String;", 58*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_nextElement }, 59*977Smax.romanov@gmail.com }; 60*977Smax.romanov@gmail.com 61*977Smax.romanov@gmail.com res = (*env)->RegisterNatives(env, nxt_java_HeadersEnumeration_class, 62*977Smax.romanov@gmail.com methods, 63*977Smax.romanov@gmail.com sizeof(methods) / sizeof(methods[0])); 64*977Smax.romanov@gmail.com 65*977Smax.romanov@gmail.com nxt_unit_debug(NULL, "registered HeadersEnumeration methods: %d", res); 66*977Smax.romanov@gmail.com 67*977Smax.romanov@gmail.com if (res != 0) { 68*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, cls); 69*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 70*977Smax.romanov@gmail.com } 71*977Smax.romanov@gmail.com 72*977Smax.romanov@gmail.com return NXT_UNIT_OK; 73*977Smax.romanov@gmail.com } 74*977Smax.romanov@gmail.com 75*977Smax.romanov@gmail.com 76*977Smax.romanov@gmail.com jobject 77*977Smax.romanov@gmail.com nxt_java_newHeadersEnumeration(JNIEnv *env, nxt_unit_field_t *f, 78*977Smax.romanov@gmail.com uint32_t fields_count, uint32_t pos) 79*977Smax.romanov@gmail.com { 80*977Smax.romanov@gmail.com return (*env)->NewObject(env, 81*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_class, 82*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_ctor, nxt_ptr2jlong(f), 83*977Smax.romanov@gmail.com (jlong) fields_count, (jlong) pos); 84*977Smax.romanov@gmail.com } 85*977Smax.romanov@gmail.com 86*977Smax.romanov@gmail.com 87*977Smax.romanov@gmail.com static jlong JNICALL 88*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_nextElementPos(JNIEnv *env, jclass cls, 89*977Smax.romanov@gmail.com jlong headers_ptr, jlong size, jlong ipos, jlong pos) 90*977Smax.romanov@gmail.com { 91*977Smax.romanov@gmail.com nxt_unit_field_t *f, *init_field; 92*977Smax.romanov@gmail.com 93*977Smax.romanov@gmail.com f = nxt_jlong2ptr(headers_ptr); 94*977Smax.romanov@gmail.com 95*977Smax.romanov@gmail.com init_field = f + ipos; 96*977Smax.romanov@gmail.com 97*977Smax.romanov@gmail.com if (pos >= size) { 98*977Smax.romanov@gmail.com return size; 99*977Smax.romanov@gmail.com } 100*977Smax.romanov@gmail.com 101*977Smax.romanov@gmail.com f += pos; 102*977Smax.romanov@gmail.com 103*977Smax.romanov@gmail.com if (f->hash != init_field->hash 104*977Smax.romanov@gmail.com || f->name_length != init_field->name_length) 105*977Smax.romanov@gmail.com { 106*977Smax.romanov@gmail.com return size; 107*977Smax.romanov@gmail.com } 108*977Smax.romanov@gmail.com 109*977Smax.romanov@gmail.com if (!nxt_java_strcaseeq(nxt_unit_sptr_get(&f->name), 110*977Smax.romanov@gmail.com nxt_unit_sptr_get(&init_field->name), 111*977Smax.romanov@gmail.com init_field->name_length)) 112*977Smax.romanov@gmail.com { 113*977Smax.romanov@gmail.com return size; 114*977Smax.romanov@gmail.com } 115*977Smax.romanov@gmail.com 116*977Smax.romanov@gmail.com return pos; 117*977Smax.romanov@gmail.com } 118*977Smax.romanov@gmail.com 119*977Smax.romanov@gmail.com 120*977Smax.romanov@gmail.com static jstring JNICALL 121*977Smax.romanov@gmail.com nxt_java_HeadersEnumeration_nextElement(JNIEnv *env, jclass cls, 122*977Smax.romanov@gmail.com jlong headers_ptr, jlong size, jlong ipos, jlong pos) 123*977Smax.romanov@gmail.com { 124*977Smax.romanov@gmail.com nxt_unit_field_t *f, *init_field; 125*977Smax.romanov@gmail.com 126*977Smax.romanov@gmail.com f = nxt_jlong2ptr(headers_ptr); 127*977Smax.romanov@gmail.com 128*977Smax.romanov@gmail.com init_field = f + ipos; 129*977Smax.romanov@gmail.com 130*977Smax.romanov@gmail.com if (pos >= size) { 131*977Smax.romanov@gmail.com nxt_java_throw_IOException(env, "pos >= size"); 132*977Smax.romanov@gmail.com 133*977Smax.romanov@gmail.com return NULL; 134*977Smax.romanov@gmail.com } 135*977Smax.romanov@gmail.com 136*977Smax.romanov@gmail.com f += pos; 137*977Smax.romanov@gmail.com 138*977Smax.romanov@gmail.com if (f->hash != init_field->hash 139*977Smax.romanov@gmail.com || f->name_length != init_field->name_length) 140*977Smax.romanov@gmail.com { 141*977Smax.romanov@gmail.com nxt_java_throw_IOException(env, "f->hash != hash"); 142*977Smax.romanov@gmail.com 143*977Smax.romanov@gmail.com return NULL; 144*977Smax.romanov@gmail.com } 145*977Smax.romanov@gmail.com 146*977Smax.romanov@gmail.com return nxt_java_newString(env, nxt_unit_sptr_get(&f->value), 147*977Smax.romanov@gmail.com f->value_length); 148*977Smax.romanov@gmail.com } 149