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 <jni.h> 9*977Smax.romanov@gmail.com #include <nxt_unit.h> 10*977Smax.romanov@gmail.com #include <nxt_unit_field.h> 11*977Smax.romanov@gmail.com 12*977Smax.romanov@gmail.com #include "nxt_jni.h" 13*977Smax.romanov@gmail.com 14*977Smax.romanov@gmail.com 15*977Smax.romanov@gmail.com static jclass nxt_java_NoSuchElementException_class; 16*977Smax.romanov@gmail.com static jclass nxt_java_IOException_class; 17*977Smax.romanov@gmail.com static jclass nxt_java_IllegalStateException_class; 18*977Smax.romanov@gmail.com static jclass nxt_java_File_class; 19*977Smax.romanov@gmail.com static jmethodID nxt_java_File_ctor; 20*977Smax.romanov@gmail.com 21*977Smax.romanov@gmail.com static inline char nxt_java_lowcase(char c); 22*977Smax.romanov@gmail.com 23*977Smax.romanov@gmail.com 24*977Smax.romanov@gmail.com int 25*977Smax.romanov@gmail.com nxt_java_jni_init(JNIEnv *env) 26*977Smax.romanov@gmail.com { 27*977Smax.romanov@gmail.com jclass cls; 28*977Smax.romanov@gmail.com 29*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/util/NoSuchElementException"); 30*977Smax.romanov@gmail.com if (cls == NULL) { 31*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 32*977Smax.romanov@gmail.com } 33*977Smax.romanov@gmail.com 34*977Smax.romanov@gmail.com nxt_java_NoSuchElementException_class = (*env)->NewGlobalRef(env, cls); 35*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 36*977Smax.romanov@gmail.com 37*977Smax.romanov@gmail.com 38*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/io/IOException"); 39*977Smax.romanov@gmail.com if (cls == NULL) { 40*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class); 41*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 42*977Smax.romanov@gmail.com } 43*977Smax.romanov@gmail.com 44*977Smax.romanov@gmail.com nxt_java_IOException_class = (*env)->NewGlobalRef(env, cls); 45*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 46*977Smax.romanov@gmail.com 47*977Smax.romanov@gmail.com 48*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/lang/IllegalStateException"); 49*977Smax.romanov@gmail.com if (cls == NULL) { 50*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class); 51*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class); 52*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 53*977Smax.romanov@gmail.com } 54*977Smax.romanov@gmail.com 55*977Smax.romanov@gmail.com nxt_java_IllegalStateException_class = (*env)->NewGlobalRef(env, cls); 56*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 57*977Smax.romanov@gmail.com 58*977Smax.romanov@gmail.com 59*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/io/File"); 60*977Smax.romanov@gmail.com if (cls == NULL) { 61*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class); 62*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class); 63*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IllegalStateException_class); 64*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 65*977Smax.romanov@gmail.com } 66*977Smax.romanov@gmail.com 67*977Smax.romanov@gmail.com nxt_java_File_class = (*env)->NewGlobalRef(env, cls); 68*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls); 69*977Smax.romanov@gmail.com 70*977Smax.romanov@gmail.com 71*977Smax.romanov@gmail.com nxt_java_File_ctor = (*env)->GetMethodID(env, nxt_java_File_class, "<init>", 72*977Smax.romanov@gmail.com "(Ljava/lang/String;)V"); 73*977Smax.romanov@gmail.com if (nxt_java_File_ctor == NULL) { 74*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class); 75*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class); 76*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IllegalStateException_class); 77*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_File_class); 78*977Smax.romanov@gmail.com return NXT_UNIT_ERROR; 79*977Smax.romanov@gmail.com } 80*977Smax.romanov@gmail.com 81*977Smax.romanov@gmail.com return NXT_UNIT_OK; 82*977Smax.romanov@gmail.com } 83*977Smax.romanov@gmail.com 84*977Smax.romanov@gmail.com 85*977Smax.romanov@gmail.com void 86*977Smax.romanov@gmail.com nxt_java_throw_NoSuchElementException(JNIEnv *env, const char *msg) 87*977Smax.romanov@gmail.com { 88*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_NoSuchElementException_class, msg); 89*977Smax.romanov@gmail.com } 90*977Smax.romanov@gmail.com 91*977Smax.romanov@gmail.com 92*977Smax.romanov@gmail.com void 93*977Smax.romanov@gmail.com nxt_java_throw_IOException(JNIEnv *env, const char *msg) 94*977Smax.romanov@gmail.com { 95*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_IOException_class, msg); 96*977Smax.romanov@gmail.com } 97*977Smax.romanov@gmail.com 98*977Smax.romanov@gmail.com 99*977Smax.romanov@gmail.com void 100*977Smax.romanov@gmail.com nxt_java_throw_IllegalStateException(JNIEnv *env, const char *msg) 101*977Smax.romanov@gmail.com { 102*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_IllegalStateException_class, msg); 103*977Smax.romanov@gmail.com } 104*977Smax.romanov@gmail.com 105*977Smax.romanov@gmail.com 106*977Smax.romanov@gmail.com nxt_unit_field_t * 107*977Smax.romanov@gmail.com nxt_java_findHeader(nxt_unit_field_t *f, nxt_unit_field_t *end, 108*977Smax.romanov@gmail.com const char *name, uint8_t name_len) 109*977Smax.romanov@gmail.com { 110*977Smax.romanov@gmail.com const char *field_name; 111*977Smax.romanov@gmail.com 112*977Smax.romanov@gmail.com for (/* void */ ; f < end; f++) { 113*977Smax.romanov@gmail.com if (f->skip != 0 || f->name_length != name_len) { 114*977Smax.romanov@gmail.com continue; 115*977Smax.romanov@gmail.com } 116*977Smax.romanov@gmail.com 117*977Smax.romanov@gmail.com field_name = nxt_unit_sptr_get(&f->name); 118*977Smax.romanov@gmail.com 119*977Smax.romanov@gmail.com if (nxt_java_strcaseeq(name, field_name, name_len)) { 120*977Smax.romanov@gmail.com return f; 121*977Smax.romanov@gmail.com } 122*977Smax.romanov@gmail.com } 123*977Smax.romanov@gmail.com 124*977Smax.romanov@gmail.com return NULL; 125*977Smax.romanov@gmail.com } 126*977Smax.romanov@gmail.com 127*977Smax.romanov@gmail.com 128*977Smax.romanov@gmail.com int 129*977Smax.romanov@gmail.com nxt_java_strcaseeq(const char *str1, const char *str2, int len) 130*977Smax.romanov@gmail.com { 131*977Smax.romanov@gmail.com char c1, c2; 132*977Smax.romanov@gmail.com const char *end1; 133*977Smax.romanov@gmail.com 134*977Smax.romanov@gmail.com end1 = str1 + len; 135*977Smax.romanov@gmail.com 136*977Smax.romanov@gmail.com while (str1 < end1) { 137*977Smax.romanov@gmail.com c1 = nxt_java_lowcase(*str1++); 138*977Smax.romanov@gmail.com c2 = nxt_java_lowcase(*str2++); 139*977Smax.romanov@gmail.com 140*977Smax.romanov@gmail.com if (c1 != c2) { 141*977Smax.romanov@gmail.com return 0; 142*977Smax.romanov@gmail.com } 143*977Smax.romanov@gmail.com } 144*977Smax.romanov@gmail.com 145*977Smax.romanov@gmail.com return 1; 146*977Smax.romanov@gmail.com } 147*977Smax.romanov@gmail.com 148*977Smax.romanov@gmail.com 149*977Smax.romanov@gmail.com static inline char 150*977Smax.romanov@gmail.com nxt_java_lowcase(char c) 151*977Smax.romanov@gmail.com { 152*977Smax.romanov@gmail.com return (c >= 'A' && c <= 'Z') ? c | 0x20 : c; 153*977Smax.romanov@gmail.com } 154*977Smax.romanov@gmail.com 155*977Smax.romanov@gmail.com 156*977Smax.romanov@gmail.com jstring 157*977Smax.romanov@gmail.com nxt_java_newString(JNIEnv *env, char *str, uint32_t len) 158*977Smax.romanov@gmail.com { 159*977Smax.romanov@gmail.com char tmp; 160*977Smax.romanov@gmail.com jstring res; 161*977Smax.romanov@gmail.com 162*977Smax.romanov@gmail.com tmp = str[len]; 163*977Smax.romanov@gmail.com 164*977Smax.romanov@gmail.com if (tmp != '\0') { 165*977Smax.romanov@gmail.com str[len] = '\0'; 166*977Smax.romanov@gmail.com } 167*977Smax.romanov@gmail.com 168*977Smax.romanov@gmail.com res = (*env)->NewStringUTF(env, str); 169*977Smax.romanov@gmail.com 170*977Smax.romanov@gmail.com if (tmp != '\0') { 171*977Smax.romanov@gmail.com str[len] = tmp; 172*977Smax.romanov@gmail.com } 173*977Smax.romanov@gmail.com 174*977Smax.romanov@gmail.com return res; 175*977Smax.romanov@gmail.com } 176