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
nxt_java_initHeadersEnumeration(JNIEnv * env,jobject cl)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
nxt_java_newHeadersEnumeration(JNIEnv * env,nxt_unit_field_t * f,uint32_t fields_count,uint32_t pos)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
nxt_java_HeadersEnumeration_nextElementPos(JNIEnv * env,jclass cls,jlong headers_ptr,jlong size,jlong ipos,jlong pos)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
nxt_java_HeadersEnumeration_nextElement(JNIEnv * env,jclass cls,jlong headers_ptr,jlong size,jlong ipos,jlong pos)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