xref: /unit/src/java/nxt_jni_Request.c (revision 1157:7ae152bda303)
1977Smax.romanov@gmail.com 
2977Smax.romanov@gmail.com /*
3977Smax.romanov@gmail.com  * Copyright (C) NGINX, Inc.
4977Smax.romanov@gmail.com  */
5977Smax.romanov@gmail.com 
6977Smax.romanov@gmail.com #include <nxt_auto_config.h>
7977Smax.romanov@gmail.com 
8977Smax.romanov@gmail.com #include <nxt_unit.h>
9977Smax.romanov@gmail.com #include <nxt_unit_request.h>
10977Smax.romanov@gmail.com #include <jni.h>
11977Smax.romanov@gmail.com #include <stdio.h>
12977Smax.romanov@gmail.com #include <stdlib.h>
13977Smax.romanov@gmail.com 
14977Smax.romanov@gmail.com #include "nxt_jni.h"
15977Smax.romanov@gmail.com #include "nxt_jni_Request.h"
16977Smax.romanov@gmail.com #include "nxt_jni_URLClassLoader.h"
17977Smax.romanov@gmail.com #include "nxt_jni_HeadersEnumeration.h"
18977Smax.romanov@gmail.com #include "nxt_jni_HeaderNamesEnumeration.h"
19977Smax.romanov@gmail.com 
20977Smax.romanov@gmail.com 
21977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getHeader(JNIEnv *env, jclass cls,
22977Smax.romanov@gmail.com     jlong req_ptr, jstring name, jint name_len);
23977Smax.romanov@gmail.com static jobject JNICALL nxt_java_Request_getHeaderNames(JNIEnv *env, jclass cls,
24977Smax.romanov@gmail.com     jlong req_ptr);
25977Smax.romanov@gmail.com static jobject JNICALL nxt_java_Request_getHeaders(JNIEnv *env, jclass cls,
26977Smax.romanov@gmail.com     jlong req_ptr, jstring name, jint name_len);
27977Smax.romanov@gmail.com static jint JNICALL nxt_java_Request_getIntHeader(JNIEnv *env, jclass cls,
28977Smax.romanov@gmail.com     jlong req_ptr, jstring name, jint name_len);
29977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getMethod(JNIEnv *env, jclass cls,
30977Smax.romanov@gmail.com     jlong req_ptr);
31977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getQueryString(JNIEnv *env, jclass cls,
32977Smax.romanov@gmail.com     jlong req_ptr);
33977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getRequestURI(JNIEnv *env, jclass cls,
34977Smax.romanov@gmail.com     jlong req_ptr);
35977Smax.romanov@gmail.com static jlong JNICALL nxt_java_Request_getContentLength(JNIEnv *env, jclass cls,
36977Smax.romanov@gmail.com     jlong req_ptr);
37977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getContentType(JNIEnv *env, jclass cls,
38977Smax.romanov@gmail.com     jlong req_ptr);
39977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getLocalAddr(JNIEnv *env, jclass cls,
40977Smax.romanov@gmail.com     jlong req_ptr);
41977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getLocalName(JNIEnv *env, jclass cls,
42977Smax.romanov@gmail.com     jlong req_ptr);
43977Smax.romanov@gmail.com static jint JNICALL nxt_java_Request_getLocalPort(JNIEnv *env, jclass cls,
44977Smax.romanov@gmail.com     jlong req_ptr);
45977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getProtocol(JNIEnv *env, jclass cls,
46977Smax.romanov@gmail.com     jlong req_ptr);
47977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getRemoteAddr(JNIEnv *env, jclass cls,
48977Smax.romanov@gmail.com     jlong req_ptr);
49977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getRemoteHost(JNIEnv *env, jclass cls,
50977Smax.romanov@gmail.com     jlong req_ptr);
51977Smax.romanov@gmail.com static jint JNICALL nxt_java_Request_getRemotePort(JNIEnv *env, jclass cls,
52977Smax.romanov@gmail.com     jlong req_ptr);
53977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getScheme(JNIEnv *env, jclass cls,
54977Smax.romanov@gmail.com     jlong req_ptr);
55977Smax.romanov@gmail.com static jstring JNICALL nxt_java_Request_getServerName(JNIEnv *env, jclass cls,
56977Smax.romanov@gmail.com     jlong req_ptr);
57977Smax.romanov@gmail.com static jint JNICALL nxt_java_Request_getServerPort(JNIEnv *env, jclass cls,
58977Smax.romanov@gmail.com     jlong req_ptr);
591011Smax.romanov@nginx.com static jboolean JNICALL nxt_java_Request_isSecure(JNIEnv *env, jclass cls,
601011Smax.romanov@nginx.com     jlong req_ptr);
61*1157Smax.romanov@nginx.com static void JNICALL nxt_java_Request_upgrade(JNIEnv *env, jclass cls,
62*1157Smax.romanov@nginx.com     jlong req_info_ptr);
63*1157Smax.romanov@nginx.com static jboolean JNICALL nxt_java_Request_isUpgrade(JNIEnv *env, jclass cls,
64*1157Smax.romanov@nginx.com     jlong req_info_ptr);
65977Smax.romanov@gmail.com static void JNICALL nxt_java_Request_log(JNIEnv *env, jclass cls,
66977Smax.romanov@gmail.com     jlong req_info_ptr, jstring msg, jint msg_len);
67977Smax.romanov@gmail.com static void JNICALL nxt_java_Request_trace(JNIEnv *env, jclass cls,
68977Smax.romanov@gmail.com     jlong req_info_ptr, jstring msg, jint msg_len);
69977Smax.romanov@gmail.com static jobject JNICALL nxt_java_Request_getResponse(JNIEnv *env, jclass cls,
70977Smax.romanov@gmail.com     jlong req_info_ptr);
71*1157Smax.romanov@nginx.com static void JNICALL nxt_java_Request_sendWsFrameBuf(JNIEnv *env, jclass cls,
72*1157Smax.romanov@nginx.com     jlong req_info_ptr, jobject buf, jint pos, jint len, jbyte opCode, jboolean last);
73*1157Smax.romanov@nginx.com static void JNICALL nxt_java_Request_sendWsFrameArr(JNIEnv *env, jclass cls,
74*1157Smax.romanov@nginx.com     jlong req_info_ptr, jarray arr, jint pos, jint len, jbyte opCode, jboolean last);
75*1157Smax.romanov@nginx.com static void JNICALL nxt_java_Request_closeWs(JNIEnv *env, jclass cls,
76*1157Smax.romanov@nginx.com     jlong req_info_ptr);
77977Smax.romanov@gmail.com 
78977Smax.romanov@gmail.com 
79977Smax.romanov@gmail.com static jclass     nxt_java_Request_class;
80977Smax.romanov@gmail.com static jmethodID  nxt_java_Request_ctor;
81*1157Smax.romanov@nginx.com static jmethodID  nxt_java_Request_processWsFrame;
82*1157Smax.romanov@nginx.com static jmethodID  nxt_java_Request_closeWsSession;
83977Smax.romanov@gmail.com 
84977Smax.romanov@gmail.com 
85977Smax.romanov@gmail.com int
nxt_java_initRequest(JNIEnv * env,jobject cl)86977Smax.romanov@gmail.com nxt_java_initRequest(JNIEnv *env, jobject cl)
87977Smax.romanov@gmail.com {
88977Smax.romanov@gmail.com     int     res;
89977Smax.romanov@gmail.com     jclass  cls;
90977Smax.romanov@gmail.com 
91977Smax.romanov@gmail.com     cls = nxt_java_loadClass(env, cl, "nginx.unit.Request");
92977Smax.romanov@gmail.com     if (cls == NULL) {
93977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
94977Smax.romanov@gmail.com     }
95977Smax.romanov@gmail.com 
96977Smax.romanov@gmail.com     nxt_java_Request_class = (*env)->NewGlobalRef(env, cls);
97977Smax.romanov@gmail.com     (*env)->DeleteLocalRef(env, cls);
98977Smax.romanov@gmail.com     cls = nxt_java_Request_class;
99977Smax.romanov@gmail.com 
100977Smax.romanov@gmail.com     nxt_java_Request_ctor = (*env)->GetMethodID(env, cls, "<init>", "(Lnginx/unit/Context;JJ)V");
101977Smax.romanov@gmail.com     if (nxt_java_Request_ctor == NULL) {
102977Smax.romanov@gmail.com         (*env)->DeleteGlobalRef(env, cls);
103977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
104977Smax.romanov@gmail.com     }
105977Smax.romanov@gmail.com 
106*1157Smax.romanov@nginx.com     nxt_java_Request_processWsFrame = (*env)->GetMethodID(env, cls, "processWsFrame", "(Ljava/nio/ByteBuffer;BZ)V");
107*1157Smax.romanov@nginx.com     if (nxt_java_Request_processWsFrame == NULL) {
108*1157Smax.romanov@nginx.com         (*env)->DeleteGlobalRef(env, cls);
109*1157Smax.romanov@nginx.com         return NXT_UNIT_ERROR;
110*1157Smax.romanov@nginx.com     }
111*1157Smax.romanov@nginx.com 
112*1157Smax.romanov@nginx.com     nxt_java_Request_closeWsSession = (*env)->GetMethodID(env, cls, "closeWsSession", "()V");
113*1157Smax.romanov@nginx.com     if (nxt_java_Request_closeWsSession == NULL) {
114*1157Smax.romanov@nginx.com         (*env)->DeleteGlobalRef(env, cls);
115*1157Smax.romanov@nginx.com         return NXT_UNIT_ERROR;
116*1157Smax.romanov@nginx.com     }
117*1157Smax.romanov@nginx.com 
118977Smax.romanov@gmail.com     JNINativeMethod request_methods[] = {
119977Smax.romanov@gmail.com         { (char *) "getHeader",
120977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)Ljava/lang/String;",
121977Smax.romanov@gmail.com           nxt_java_Request_getHeader },
122977Smax.romanov@gmail.com 
123977Smax.romanov@gmail.com         { (char *) "getHeaderNames",
124977Smax.romanov@gmail.com           (char *) "(J)Ljava/util/Enumeration;",
125977Smax.romanov@gmail.com           nxt_java_Request_getHeaderNames },
126977Smax.romanov@gmail.com 
127977Smax.romanov@gmail.com         { (char *) "getHeaders",
128977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)Ljava/util/Enumeration;",
129977Smax.romanov@gmail.com           nxt_java_Request_getHeaders },
130977Smax.romanov@gmail.com 
131977Smax.romanov@gmail.com         { (char *) "getIntHeader",
132977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)I",
133977Smax.romanov@gmail.com           nxt_java_Request_getIntHeader },
134977Smax.romanov@gmail.com 
135977Smax.romanov@gmail.com         { (char *) "getMethod",
136977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
137977Smax.romanov@gmail.com           nxt_java_Request_getMethod },
138977Smax.romanov@gmail.com 
139977Smax.romanov@gmail.com         { (char *) "getQueryString",
140977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
141977Smax.romanov@gmail.com           nxt_java_Request_getQueryString },
142977Smax.romanov@gmail.com 
143977Smax.romanov@gmail.com         { (char *) "getRequestURI",
144977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
145977Smax.romanov@gmail.com           nxt_java_Request_getRequestURI },
146977Smax.romanov@gmail.com 
147977Smax.romanov@gmail.com         { (char *) "getContentLength",
148977Smax.romanov@gmail.com           (char *) "(J)J",
149977Smax.romanov@gmail.com           nxt_java_Request_getContentLength },
150977Smax.romanov@gmail.com 
151977Smax.romanov@gmail.com         { (char *) "getContentType",
152977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
153977Smax.romanov@gmail.com           nxt_java_Request_getContentType },
154977Smax.romanov@gmail.com 
155977Smax.romanov@gmail.com         { (char *) "getLocalAddr",
156977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
157977Smax.romanov@gmail.com           nxt_java_Request_getLocalAddr },
158977Smax.romanov@gmail.com 
159977Smax.romanov@gmail.com         { (char *) "getLocalName",
160977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
161977Smax.romanov@gmail.com           nxt_java_Request_getLocalName },
162977Smax.romanov@gmail.com 
163977Smax.romanov@gmail.com         { (char *) "getLocalPort",
164977Smax.romanov@gmail.com           (char *) "(J)I",
165977Smax.romanov@gmail.com           nxt_java_Request_getLocalPort },
166977Smax.romanov@gmail.com 
167977Smax.romanov@gmail.com         { (char *) "getProtocol",
168977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
169977Smax.romanov@gmail.com           nxt_java_Request_getProtocol },
170977Smax.romanov@gmail.com 
171977Smax.romanov@gmail.com         { (char *) "getRemoteAddr",
172977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
173977Smax.romanov@gmail.com           nxt_java_Request_getRemoteAddr },
174977Smax.romanov@gmail.com 
175977Smax.romanov@gmail.com         { (char *) "getRemoteHost",
176977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
177977Smax.romanov@gmail.com           nxt_java_Request_getRemoteHost },
178977Smax.romanov@gmail.com 
179977Smax.romanov@gmail.com         { (char *) "getRemotePort",
180977Smax.romanov@gmail.com           (char *) "(J)I",
181977Smax.romanov@gmail.com           nxt_java_Request_getRemotePort },
182977Smax.romanov@gmail.com 
183977Smax.romanov@gmail.com         { (char *) "getScheme",
184977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
185977Smax.romanov@gmail.com           nxt_java_Request_getScheme },
186977Smax.romanov@gmail.com 
187977Smax.romanov@gmail.com         { (char *) "getServerName",
188977Smax.romanov@gmail.com           (char *) "(J)Ljava/lang/String;",
189977Smax.romanov@gmail.com           nxt_java_Request_getServerName },
190977Smax.romanov@gmail.com 
191977Smax.romanov@gmail.com         { (char *) "getServerPort",
192977Smax.romanov@gmail.com           (char *) "(J)I",
193977Smax.romanov@gmail.com           nxt_java_Request_getServerPort },
194977Smax.romanov@gmail.com 
1951011Smax.romanov@nginx.com         { (char *) "isSecure",
1961011Smax.romanov@nginx.com           (char *) "(J)Z",
1971011Smax.romanov@nginx.com           nxt_java_Request_isSecure },
1981011Smax.romanov@nginx.com 
199*1157Smax.romanov@nginx.com         { (char *) "upgrade",
200*1157Smax.romanov@nginx.com           (char *) "(J)V",
201*1157Smax.romanov@nginx.com           nxt_java_Request_upgrade },
202*1157Smax.romanov@nginx.com 
203*1157Smax.romanov@nginx.com         { (char *) "isUpgrade",
204*1157Smax.romanov@nginx.com           (char *) "(J)Z",
205*1157Smax.romanov@nginx.com           nxt_java_Request_isUpgrade },
206*1157Smax.romanov@nginx.com 
207977Smax.romanov@gmail.com         { (char *) "log",
208977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)V",
209977Smax.romanov@gmail.com           nxt_java_Request_log },
210977Smax.romanov@gmail.com 
211977Smax.romanov@gmail.com         { (char *) "trace",
212977Smax.romanov@gmail.com           (char *) "(JLjava/lang/String;I)V",
213977Smax.romanov@gmail.com           nxt_java_Request_trace },
214977Smax.romanov@gmail.com 
215977Smax.romanov@gmail.com         { (char *) "getResponse",
216977Smax.romanov@gmail.com           (char *) "(J)Lnginx/unit/Response;",
217977Smax.romanov@gmail.com           nxt_java_Request_getResponse },
218977Smax.romanov@gmail.com 
219*1157Smax.romanov@nginx.com         { (char *) "sendWsFrame",
220*1157Smax.romanov@nginx.com           (char *) "(JLjava/nio/ByteBuffer;IIBZ)V",
221*1157Smax.romanov@nginx.com           nxt_java_Request_sendWsFrameBuf },
222*1157Smax.romanov@nginx.com 
223*1157Smax.romanov@nginx.com         { (char *) "sendWsFrame",
224*1157Smax.romanov@nginx.com           (char *) "(J[BIIBZ)V",
225*1157Smax.romanov@nginx.com           nxt_java_Request_sendWsFrameArr },
226*1157Smax.romanov@nginx.com 
227*1157Smax.romanov@nginx.com         { (char *) "closeWs",
228*1157Smax.romanov@nginx.com           (char *) "(J)V",
229*1157Smax.romanov@nginx.com           nxt_java_Request_closeWs },
230*1157Smax.romanov@nginx.com 
231977Smax.romanov@gmail.com     };
232977Smax.romanov@gmail.com 
233977Smax.romanov@gmail.com     res = (*env)->RegisterNatives(env, nxt_java_Request_class,
234977Smax.romanov@gmail.com                                   request_methods,
235977Smax.romanov@gmail.com                                   sizeof(request_methods) / sizeof(request_methods[0]));
236977Smax.romanov@gmail.com 
237977Smax.romanov@gmail.com     nxt_unit_debug(NULL, "registered Request methods: %d", res);
238977Smax.romanov@gmail.com 
239977Smax.romanov@gmail.com     if (res != 0) {
240977Smax.romanov@gmail.com         nxt_unit_warn(NULL, "registering natives for Request failed");
241977Smax.romanov@gmail.com         goto failed;
242977Smax.romanov@gmail.com     }
243977Smax.romanov@gmail.com 
244977Smax.romanov@gmail.com     res = nxt_java_initHeadersEnumeration(env, cl);
245977Smax.romanov@gmail.com     if (res != NXT_UNIT_OK) {
246977Smax.romanov@gmail.com         goto failed;
247977Smax.romanov@gmail.com     }
248977Smax.romanov@gmail.com 
249977Smax.romanov@gmail.com     res = nxt_java_initHeaderNamesEnumeration(env, cl);
250977Smax.romanov@gmail.com     if (res != NXT_UNIT_OK) {
251977Smax.romanov@gmail.com         goto failed;
252977Smax.romanov@gmail.com     }
253977Smax.romanov@gmail.com 
254977Smax.romanov@gmail.com     return NXT_UNIT_OK;
255977Smax.romanov@gmail.com 
256977Smax.romanov@gmail.com failed:
257977Smax.romanov@gmail.com 
258977Smax.romanov@gmail.com     (*env)->DeleteGlobalRef(env, cls);
259977Smax.romanov@gmail.com     return NXT_UNIT_ERROR;
260977Smax.romanov@gmail.com }
261977Smax.romanov@gmail.com 
262977Smax.romanov@gmail.com 
263977Smax.romanov@gmail.com jobject
nxt_java_newRequest(JNIEnv * env,jobject ctx,nxt_unit_request_info_t * req)264977Smax.romanov@gmail.com nxt_java_newRequest(JNIEnv *env, jobject ctx, nxt_unit_request_info_t *req)
265977Smax.romanov@gmail.com {
266977Smax.romanov@gmail.com     return (*env)->NewObject(env, nxt_java_Request_class,
267977Smax.romanov@gmail.com         nxt_java_Request_ctor, ctx, nxt_ptr2jlong(req),
268977Smax.romanov@gmail.com         nxt_ptr2jlong(req->request));
269977Smax.romanov@gmail.com }
270977Smax.romanov@gmail.com 
271977Smax.romanov@gmail.com 
272977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getHeader(JNIEnv * env,jclass cls,jlong req_ptr,jstring name,jint name_len)273977Smax.romanov@gmail.com nxt_java_Request_getHeader(JNIEnv *env, jclass cls, jlong req_ptr,
274977Smax.romanov@gmail.com     jstring name, jint name_len)
275977Smax.romanov@gmail.com {
276977Smax.romanov@gmail.com     const char          *name_str;
277977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
278977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
279977Smax.romanov@gmail.com 
280977Smax.romanov@gmail.com     name_str = (*env)->GetStringUTFChars(env, name, NULL);
281977Smax.romanov@gmail.com     if (name_str == NULL) {
282977Smax.romanov@gmail.com         return NULL;
283977Smax.romanov@gmail.com     }
284977Smax.romanov@gmail.com 
285977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
286977Smax.romanov@gmail.com 
287977Smax.romanov@gmail.com     f = nxt_java_findHeader(r->fields, r->fields + r->fields_count,
288977Smax.romanov@gmail.com                             name_str, name_len);
289977Smax.romanov@gmail.com 
290977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, name, name_str);
291977Smax.romanov@gmail.com 
292977Smax.romanov@gmail.com     if (f == NULL) {
293977Smax.romanov@gmail.com         return NULL;
294977Smax.romanov@gmail.com     }
295977Smax.romanov@gmail.com 
296977Smax.romanov@gmail.com     return (*env)->NewStringUTF(env, nxt_unit_sptr_get(&f->value));
297977Smax.romanov@gmail.com }
298977Smax.romanov@gmail.com 
299977Smax.romanov@gmail.com 
300977Smax.romanov@gmail.com static jobject JNICALL
nxt_java_Request_getHeaderNames(JNIEnv * env,jclass cls,jlong req_ptr)301977Smax.romanov@gmail.com nxt_java_Request_getHeaderNames(JNIEnv *env, jclass cls, jlong req_ptr)
302977Smax.romanov@gmail.com {
303977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
304977Smax.romanov@gmail.com 
305977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
306977Smax.romanov@gmail.com 
307977Smax.romanov@gmail.com     return nxt_java_newHeaderNamesEnumeration(env, r->fields, r->fields_count);
308977Smax.romanov@gmail.com }
309977Smax.romanov@gmail.com 
310977Smax.romanov@gmail.com 
311977Smax.romanov@gmail.com static jobject JNICALL
nxt_java_Request_getHeaders(JNIEnv * env,jclass cls,jlong req_ptr,jstring name,jint name_len)312977Smax.romanov@gmail.com nxt_java_Request_getHeaders(JNIEnv *env, jclass cls, jlong req_ptr,
313977Smax.romanov@gmail.com     jstring name, jint name_len)
314977Smax.romanov@gmail.com {
315977Smax.romanov@gmail.com     const char          *name_str;
316977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
317977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
318977Smax.romanov@gmail.com 
319977Smax.romanov@gmail.com     name_str = (*env)->GetStringUTFChars(env, name, NULL);
320977Smax.romanov@gmail.com     if (name_str == NULL) {
321977Smax.romanov@gmail.com         return NULL;
322977Smax.romanov@gmail.com     }
323977Smax.romanov@gmail.com 
324977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
325977Smax.romanov@gmail.com 
326977Smax.romanov@gmail.com     f = nxt_java_findHeader(r->fields, r->fields + r->fields_count,
327977Smax.romanov@gmail.com                             name_str, name_len);
328977Smax.romanov@gmail.com 
329977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, name, name_str);
330977Smax.romanov@gmail.com 
331977Smax.romanov@gmail.com     if (f == NULL) {
332977Smax.romanov@gmail.com         f = r->fields + r->fields_count;
333977Smax.romanov@gmail.com     }
334977Smax.romanov@gmail.com 
335977Smax.romanov@gmail.com     return nxt_java_newHeadersEnumeration(env, r->fields, r->fields_count,
336977Smax.romanov@gmail.com                                           f - r->fields);
337977Smax.romanov@gmail.com }
338977Smax.romanov@gmail.com 
339977Smax.romanov@gmail.com 
340977Smax.romanov@gmail.com static jint JNICALL
nxt_java_Request_getIntHeader(JNIEnv * env,jclass cls,jlong req_ptr,jstring name,jint name_len)341977Smax.romanov@gmail.com nxt_java_Request_getIntHeader(JNIEnv *env, jclass cls, jlong req_ptr,
342977Smax.romanov@gmail.com     jstring name, jint name_len)
343977Smax.romanov@gmail.com {
344977Smax.romanov@gmail.com     jint                res;
345977Smax.romanov@gmail.com     char                *value, *end;
346977Smax.romanov@gmail.com     const char          *name_str;
347977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
348977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
349977Smax.romanov@gmail.com 
350977Smax.romanov@gmail.com     res = -1;
351977Smax.romanov@gmail.com 
352977Smax.romanov@gmail.com     name_str = (*env)->GetStringUTFChars(env, name, NULL);
353977Smax.romanov@gmail.com     if (name_str == NULL) {
354977Smax.romanov@gmail.com         return res;
355977Smax.romanov@gmail.com     }
356977Smax.romanov@gmail.com 
357977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
358977Smax.romanov@gmail.com 
359977Smax.romanov@gmail.com     f = nxt_java_findHeader(r->fields, r->fields + r->fields_count,
360977Smax.romanov@gmail.com                             name_str, name_len);
361977Smax.romanov@gmail.com 
362977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, name, name_str);
363977Smax.romanov@gmail.com 
364977Smax.romanov@gmail.com     if (f == NULL) {
365977Smax.romanov@gmail.com         return res;
366977Smax.romanov@gmail.com     }
367977Smax.romanov@gmail.com 
368977Smax.romanov@gmail.com     value = nxt_unit_sptr_get(&f->value);
369977Smax.romanov@gmail.com     end = value + f->value_length;
370977Smax.romanov@gmail.com 
371977Smax.romanov@gmail.com     res = strtol(value, &end, 10);
372977Smax.romanov@gmail.com 
373977Smax.romanov@gmail.com     if (end < value + f->value_length) {
374977Smax.romanov@gmail.com         // TODO throw NumberFormatException.forInputString(value)
375977Smax.romanov@gmail.com     }
376977Smax.romanov@gmail.com 
377977Smax.romanov@gmail.com     return res;
378977Smax.romanov@gmail.com }
379977Smax.romanov@gmail.com 
380977Smax.romanov@gmail.com 
381977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getMethod(JNIEnv * env,jclass cls,jlong req_ptr)382977Smax.romanov@gmail.com nxt_java_Request_getMethod(JNIEnv *env, jclass cls, jlong req_ptr)
383977Smax.romanov@gmail.com {
384977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
385977Smax.romanov@gmail.com 
386977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
387977Smax.romanov@gmail.com 
388977Smax.romanov@gmail.com     return (*env)->NewStringUTF(env, nxt_unit_sptr_get(&r->method));
389977Smax.romanov@gmail.com }
390977Smax.romanov@gmail.com 
391977Smax.romanov@gmail.com 
392977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getQueryString(JNIEnv * env,jclass cls,jlong req_ptr)393977Smax.romanov@gmail.com nxt_java_Request_getQueryString(JNIEnv *env, jclass cls, jlong req_ptr)
394977Smax.romanov@gmail.com {
395977Smax.romanov@gmail.com     char                *query;
396977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
397977Smax.romanov@gmail.com 
398977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
399977Smax.romanov@gmail.com 
400977Smax.romanov@gmail.com     if (r->query.offset != 0) {
401977Smax.romanov@gmail.com         query = nxt_unit_sptr_get(&r->query);
402977Smax.romanov@gmail.com         return (*env)->NewStringUTF(env, query);
403977Smax.romanov@gmail.com     }
404977Smax.romanov@gmail.com 
405977Smax.romanov@gmail.com     return NULL;
406977Smax.romanov@gmail.com }
407977Smax.romanov@gmail.com 
408977Smax.romanov@gmail.com 
409977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getRequestURI(JNIEnv * env,jclass cls,jlong req_ptr)410977Smax.romanov@gmail.com nxt_java_Request_getRequestURI(JNIEnv *env, jclass cls, jlong req_ptr)
411977Smax.romanov@gmail.com {
412977Smax.romanov@gmail.com     char                *target, *query;
413977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
414977Smax.romanov@gmail.com 
415977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
416977Smax.romanov@gmail.com 
417977Smax.romanov@gmail.com     target = nxt_unit_sptr_get(&r->target);
418977Smax.romanov@gmail.com 
419977Smax.romanov@gmail.com     if (r->query.offset != 0) {
420977Smax.romanov@gmail.com         query = nxt_unit_sptr_get(&r->query);
421977Smax.romanov@gmail.com         return nxt_java_newString(env, target, query - target - 1);
422977Smax.romanov@gmail.com     }
423977Smax.romanov@gmail.com 
424977Smax.romanov@gmail.com     return (*env)->NewStringUTF(env, target);
425977Smax.romanov@gmail.com }
426977Smax.romanov@gmail.com 
427977Smax.romanov@gmail.com 
428977Smax.romanov@gmail.com static jlong JNICALL
nxt_java_Request_getContentLength(JNIEnv * env,jclass cls,jlong req_ptr)429977Smax.romanov@gmail.com nxt_java_Request_getContentLength(JNIEnv *env, jclass cls, jlong req_ptr)
430977Smax.romanov@gmail.com {
431977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
432977Smax.romanov@gmail.com 
433977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
434977Smax.romanov@gmail.com 
435977Smax.romanov@gmail.com     return r->content_length;
436977Smax.romanov@gmail.com }
437977Smax.romanov@gmail.com 
438977Smax.romanov@gmail.com 
439977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getContentType(JNIEnv * env,jclass cls,jlong req_ptr)440977Smax.romanov@gmail.com nxt_java_Request_getContentType(JNIEnv *env, jclass cls, jlong req_ptr)
441977Smax.romanov@gmail.com {
442977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
443977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
444977Smax.romanov@gmail.com 
445977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
446977Smax.romanov@gmail.com 
447977Smax.romanov@gmail.com     if (r->content_type_field != NXT_UNIT_NONE_FIELD) {
448977Smax.romanov@gmail.com         f = r->fields + r->content_type_field;
449977Smax.romanov@gmail.com 
450977Smax.romanov@gmail.com         return (*env)->NewStringUTF(env, nxt_unit_sptr_get(&f->value));
451977Smax.romanov@gmail.com     }
452977Smax.romanov@gmail.com 
453977Smax.romanov@gmail.com     return NULL;
454977Smax.romanov@gmail.com }
455977Smax.romanov@gmail.com 
456977Smax.romanov@gmail.com 
457977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getLocalAddr(JNIEnv * env,jclass cls,jlong req_ptr)458977Smax.romanov@gmail.com nxt_java_Request_getLocalAddr(JNIEnv *env, jclass cls, jlong req_ptr)
459977Smax.romanov@gmail.com {
460977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
461977Smax.romanov@gmail.com 
462977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
463977Smax.romanov@gmail.com 
464977Smax.romanov@gmail.com     return nxt_java_newString(env, nxt_unit_sptr_get(&r->local),
465977Smax.romanov@gmail.com                               r->local_length);
466977Smax.romanov@gmail.com }
467977Smax.romanov@gmail.com 
468977Smax.romanov@gmail.com 
469977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getLocalName(JNIEnv * env,jclass cls,jlong req_ptr)470977Smax.romanov@gmail.com nxt_java_Request_getLocalName(JNIEnv *env, jclass cls, jlong req_ptr)
471977Smax.romanov@gmail.com {
472977Smax.romanov@gmail.com     char                *local, *colon;
473977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
474977Smax.romanov@gmail.com 
475977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
476977Smax.romanov@gmail.com 
477977Smax.romanov@gmail.com     local = nxt_unit_sptr_get(&r->local);
478977Smax.romanov@gmail.com     colon = memchr(local, ':', r->local_length);
479977Smax.romanov@gmail.com 
480977Smax.romanov@gmail.com     if (colon == NULL) {
481977Smax.romanov@gmail.com         colon = local + r->local_length;
482977Smax.romanov@gmail.com     }
483977Smax.romanov@gmail.com 
484977Smax.romanov@gmail.com     return nxt_java_newString(env, local, colon - local);
485977Smax.romanov@gmail.com }
486977Smax.romanov@gmail.com 
487977Smax.romanov@gmail.com 
488977Smax.romanov@gmail.com static jint JNICALL
nxt_java_Request_getLocalPort(JNIEnv * env,jclass cls,jlong req_ptr)489977Smax.romanov@gmail.com nxt_java_Request_getLocalPort(JNIEnv *env, jclass cls, jlong req_ptr)
490977Smax.romanov@gmail.com {
491977Smax.romanov@gmail.com     jint                res;
492977Smax.romanov@gmail.com     char                *local, *colon, tmp;
493977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
494977Smax.romanov@gmail.com 
495977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
496977Smax.romanov@gmail.com 
497977Smax.romanov@gmail.com     local = nxt_unit_sptr_get(&r->local);
498977Smax.romanov@gmail.com     colon = memchr(local, ':', r->local_length);
499977Smax.romanov@gmail.com 
500977Smax.romanov@gmail.com     if (colon == NULL) {
501977Smax.romanov@gmail.com         return 80;
502977Smax.romanov@gmail.com     }
503977Smax.romanov@gmail.com 
504977Smax.romanov@gmail.com     tmp = local[r->local_length];
505977Smax.romanov@gmail.com 
506977Smax.romanov@gmail.com     local[r->local_length] = '\0';
507977Smax.romanov@gmail.com 
508977Smax.romanov@gmail.com     res = strtol(colon + 1, NULL, 10);
509977Smax.romanov@gmail.com 
510977Smax.romanov@gmail.com     local[r->local_length] = tmp;
511977Smax.romanov@gmail.com 
512977Smax.romanov@gmail.com     return res;
513977Smax.romanov@gmail.com }
514977Smax.romanov@gmail.com 
515977Smax.romanov@gmail.com 
516977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getProtocol(JNIEnv * env,jclass cls,jlong req_ptr)517977Smax.romanov@gmail.com nxt_java_Request_getProtocol(JNIEnv *env, jclass cls, jlong req_ptr)
518977Smax.romanov@gmail.com {
519977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
520977Smax.romanov@gmail.com 
521977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
522977Smax.romanov@gmail.com 
523977Smax.romanov@gmail.com     return (*env)->NewStringUTF(env, nxt_unit_sptr_get(&r->version));
524977Smax.romanov@gmail.com }
525977Smax.romanov@gmail.com 
526977Smax.romanov@gmail.com 
527977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getRemoteAddr(JNIEnv * env,jclass cls,jlong req_ptr)528977Smax.romanov@gmail.com nxt_java_Request_getRemoteAddr(JNIEnv *env, jclass cls, jlong req_ptr)
529977Smax.romanov@gmail.com {
530977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
531977Smax.romanov@gmail.com 
532977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
533977Smax.romanov@gmail.com 
534977Smax.romanov@gmail.com     return nxt_java_newString(env, nxt_unit_sptr_get(&r->remote),
535977Smax.romanov@gmail.com                               r->remote_length);
536977Smax.romanov@gmail.com }
537977Smax.romanov@gmail.com 
538977Smax.romanov@gmail.com 
539977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getRemoteHost(JNIEnv * env,jclass cls,jlong req_ptr)540977Smax.romanov@gmail.com nxt_java_Request_getRemoteHost(JNIEnv *env, jclass cls, jlong req_ptr)
541977Smax.romanov@gmail.com {
542977Smax.romanov@gmail.com     char                *remote, *colon;
543977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
544977Smax.romanov@gmail.com 
545977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
546977Smax.romanov@gmail.com 
547977Smax.romanov@gmail.com     remote = nxt_unit_sptr_get(&r->remote);
548977Smax.romanov@gmail.com     colon = memchr(remote, ':', r->remote_length);
549977Smax.romanov@gmail.com 
550977Smax.romanov@gmail.com     if (colon == NULL) {
551977Smax.romanov@gmail.com         colon = remote + r->remote_length;
552977Smax.romanov@gmail.com     }
553977Smax.romanov@gmail.com 
554977Smax.romanov@gmail.com     return nxt_java_newString(env, remote, colon - remote);
555977Smax.romanov@gmail.com }
556977Smax.romanov@gmail.com 
557977Smax.romanov@gmail.com 
558977Smax.romanov@gmail.com static jint JNICALL
nxt_java_Request_getRemotePort(JNIEnv * env,jclass cls,jlong req_ptr)559977Smax.romanov@gmail.com nxt_java_Request_getRemotePort(JNIEnv *env, jclass cls, jlong req_ptr)
560977Smax.romanov@gmail.com {
561977Smax.romanov@gmail.com     jint                res;
562977Smax.romanov@gmail.com     char                *remote, *colon, tmp;
563977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
564977Smax.romanov@gmail.com 
565977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
566977Smax.romanov@gmail.com 
567977Smax.romanov@gmail.com     remote = nxt_unit_sptr_get(&r->remote);
568977Smax.romanov@gmail.com     colon = memchr(remote, ':', r->remote_length);
569977Smax.romanov@gmail.com 
570977Smax.romanov@gmail.com     if (colon == NULL) {
571977Smax.romanov@gmail.com         return 80;
572977Smax.romanov@gmail.com     }
573977Smax.romanov@gmail.com 
574977Smax.romanov@gmail.com     tmp = remote[r->remote_length];
575977Smax.romanov@gmail.com 
576977Smax.romanov@gmail.com     remote[r->remote_length] = '\0';
577977Smax.romanov@gmail.com 
578977Smax.romanov@gmail.com     res = strtol(colon + 1, NULL, 10);
579977Smax.romanov@gmail.com 
580977Smax.romanov@gmail.com     remote[r->remote_length] = tmp;
581977Smax.romanov@gmail.com 
582977Smax.romanov@gmail.com     return res;
583977Smax.romanov@gmail.com }
584977Smax.romanov@gmail.com 
585977Smax.romanov@gmail.com 
586977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getScheme(JNIEnv * env,jclass cls,jlong req_ptr)587977Smax.romanov@gmail.com nxt_java_Request_getScheme(JNIEnv *env, jclass cls, jlong req_ptr)
588977Smax.romanov@gmail.com {
5891054Smax.romanov@nginx.com     nxt_unit_request_t  *r;
5901054Smax.romanov@nginx.com 
5911054Smax.romanov@nginx.com     r = nxt_jlong2ptr(req_ptr);
5921054Smax.romanov@nginx.com 
5931054Smax.romanov@nginx.com     return (*env)->NewStringUTF(env, r->tls ? "https" : "http");
594977Smax.romanov@gmail.com }
595977Smax.romanov@gmail.com 
596977Smax.romanov@gmail.com 
597977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_Request_getServerName(JNIEnv * env,jclass cls,jlong req_ptr)598977Smax.romanov@gmail.com nxt_java_Request_getServerName(JNIEnv *env, jclass cls, jlong req_ptr)
599977Smax.romanov@gmail.com {
600977Smax.romanov@gmail.com     char                *host, *colon;
601977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
602977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
603977Smax.romanov@gmail.com 
604977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
605977Smax.romanov@gmail.com 
606977Smax.romanov@gmail.com     f = nxt_java_findHeader(r->fields, r->fields + r->fields_count,
607977Smax.romanov@gmail.com                             "Host", 4);
608977Smax.romanov@gmail.com     if (f != NULL) {
609977Smax.romanov@gmail.com         host = nxt_unit_sptr_get(&f->value);
610977Smax.romanov@gmail.com 
611977Smax.romanov@gmail.com         colon = memchr(host, ':', f->value_length);
612977Smax.romanov@gmail.com 
613977Smax.romanov@gmail.com         if (colon == NULL) {
614977Smax.romanov@gmail.com             colon = host + f->value_length;
615977Smax.romanov@gmail.com         }
616977Smax.romanov@gmail.com 
617977Smax.romanov@gmail.com         return nxt_java_newString(env, host, colon - host);
618977Smax.romanov@gmail.com     }
619977Smax.romanov@gmail.com 
620977Smax.romanov@gmail.com     return nxt_java_Request_getLocalName(env, cls, req_ptr);
621977Smax.romanov@gmail.com }
622977Smax.romanov@gmail.com 
623977Smax.romanov@gmail.com 
624977Smax.romanov@gmail.com static jint JNICALL
nxt_java_Request_getServerPort(JNIEnv * env,jclass cls,jlong req_ptr)625977Smax.romanov@gmail.com nxt_java_Request_getServerPort(JNIEnv *env, jclass cls, jlong req_ptr)
626977Smax.romanov@gmail.com {
627977Smax.romanov@gmail.com     jint                res;
628977Smax.romanov@gmail.com     char                *host, *colon, tmp;
629977Smax.romanov@gmail.com     nxt_unit_field_t    *f;
630977Smax.romanov@gmail.com     nxt_unit_request_t  *r;
631977Smax.romanov@gmail.com 
632977Smax.romanov@gmail.com     r = nxt_jlong2ptr(req_ptr);
633977Smax.romanov@gmail.com 
634977Smax.romanov@gmail.com     f = nxt_java_findHeader(r->fields, r->fields + r->fields_count,
635977Smax.romanov@gmail.com                             "Host", 4);
636977Smax.romanov@gmail.com     if (f != NULL) {
637977Smax.romanov@gmail.com         host = nxt_unit_sptr_get(&f->value);
638977Smax.romanov@gmail.com 
639977Smax.romanov@gmail.com         colon = memchr(host, ':', f->value_length);
640977Smax.romanov@gmail.com 
641977Smax.romanov@gmail.com         if (colon == NULL) {
642977Smax.romanov@gmail.com             return 80;
643977Smax.romanov@gmail.com         }
644977Smax.romanov@gmail.com 
645977Smax.romanov@gmail.com         tmp = host[f->value_length];
646977Smax.romanov@gmail.com 
647977Smax.romanov@gmail.com         host[f->value_length] = '\0';
648977Smax.romanov@gmail.com 
649977Smax.romanov@gmail.com         res = strtol(colon + 1, NULL, 10);
650977Smax.romanov@gmail.com 
651977Smax.romanov@gmail.com         host[f->value_length] = tmp;
652977Smax.romanov@gmail.com 
653977Smax.romanov@gmail.com         return res;
654977Smax.romanov@gmail.com     }
655977Smax.romanov@gmail.com 
656977Smax.romanov@gmail.com     return nxt_java_Request_getLocalPort(env, cls, req_ptr);
657977Smax.romanov@gmail.com }
658977Smax.romanov@gmail.com 
659977Smax.romanov@gmail.com 
6601011Smax.romanov@nginx.com static jboolean JNICALL
nxt_java_Request_isSecure(JNIEnv * env,jclass cls,jlong req_ptr)6611011Smax.romanov@nginx.com nxt_java_Request_isSecure(JNIEnv *env, jclass cls, jlong req_ptr)
6621011Smax.romanov@nginx.com {
6631011Smax.romanov@nginx.com     nxt_unit_request_t  *r;
6641011Smax.romanov@nginx.com 
6651011Smax.romanov@nginx.com     r = nxt_jlong2ptr(req_ptr);
6661011Smax.romanov@nginx.com 
6671011Smax.romanov@nginx.com     return r->tls != 0;
6681011Smax.romanov@nginx.com }
6691011Smax.romanov@nginx.com 
6701011Smax.romanov@nginx.com 
671977Smax.romanov@gmail.com static void JNICALL
nxt_java_Request_upgrade(JNIEnv * env,jclass cls,jlong req_info_ptr)672*1157Smax.romanov@nginx.com nxt_java_Request_upgrade(JNIEnv *env, jclass cls, jlong req_info_ptr)
673*1157Smax.romanov@nginx.com {
674*1157Smax.romanov@nginx.com     nxt_unit_request_info_t  *req;
675*1157Smax.romanov@nginx.com 
676*1157Smax.romanov@nginx.com     req = nxt_jlong2ptr(req_info_ptr);
677*1157Smax.romanov@nginx.com 
678*1157Smax.romanov@nginx.com     if (!nxt_unit_response_is_init(req)) {
679*1157Smax.romanov@nginx.com         nxt_unit_response_init(req, 101, 0, 0);
680*1157Smax.romanov@nginx.com     }
681*1157Smax.romanov@nginx.com 
682*1157Smax.romanov@nginx.com     (void) nxt_unit_response_upgrade(req);
683*1157Smax.romanov@nginx.com }
684*1157Smax.romanov@nginx.com 
685*1157Smax.romanov@nginx.com 
686*1157Smax.romanov@nginx.com static jboolean JNICALL
nxt_java_Request_isUpgrade(JNIEnv * env,jclass cls,jlong req_info_ptr)687*1157Smax.romanov@nginx.com nxt_java_Request_isUpgrade(JNIEnv *env, jclass cls, jlong req_info_ptr)
688*1157Smax.romanov@nginx.com {
689*1157Smax.romanov@nginx.com     nxt_unit_request_info_t  *req;
690*1157Smax.romanov@nginx.com 
691*1157Smax.romanov@nginx.com     req = nxt_jlong2ptr(req_info_ptr);
692*1157Smax.romanov@nginx.com 
693*1157Smax.romanov@nginx.com     return nxt_unit_request_is_websocket_handshake(req);
694*1157Smax.romanov@nginx.com }
695*1157Smax.romanov@nginx.com 
696*1157Smax.romanov@nginx.com 
697*1157Smax.romanov@nginx.com static void JNICALL
nxt_java_Request_log(JNIEnv * env,jclass cls,jlong req_info_ptr,jstring msg,jint msg_len)698977Smax.romanov@gmail.com nxt_java_Request_log(JNIEnv *env, jclass cls, jlong req_info_ptr, jstring msg,
699977Smax.romanov@gmail.com     jint msg_len)
700977Smax.romanov@gmail.com {
701977Smax.romanov@gmail.com     const char               *msg_str;
702977Smax.romanov@gmail.com     nxt_unit_request_info_t  *req;
703977Smax.romanov@gmail.com 
704977Smax.romanov@gmail.com     req = nxt_jlong2ptr(req_info_ptr);
705977Smax.romanov@gmail.com 
706977Smax.romanov@gmail.com     msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
707977Smax.romanov@gmail.com     if (msg_str == NULL) {
708977Smax.romanov@gmail.com         return;
709977Smax.romanov@gmail.com     }
710977Smax.romanov@gmail.com 
711977Smax.romanov@gmail.com     nxt_unit_req_log(req, NXT_UNIT_LOG_INFO, "%.*s", msg_len, msg_str);
712977Smax.romanov@gmail.com 
713977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, msg, msg_str);
714977Smax.romanov@gmail.com }
715977Smax.romanov@gmail.com 
716977Smax.romanov@gmail.com 
717977Smax.romanov@gmail.com static void JNICALL
nxt_java_Request_trace(JNIEnv * env,jclass cls,jlong req_info_ptr,jstring msg,jint msg_len)718977Smax.romanov@gmail.com nxt_java_Request_trace(JNIEnv *env, jclass cls, jlong req_info_ptr, jstring msg,
719977Smax.romanov@gmail.com     jint msg_len)
720977Smax.romanov@gmail.com {
721977Smax.romanov@gmail.com #if (NXT_DEBUG)
722977Smax.romanov@gmail.com     const char               *msg_str;
723977Smax.romanov@gmail.com     nxt_unit_request_info_t  *req;
724977Smax.romanov@gmail.com 
725977Smax.romanov@gmail.com     req = nxt_jlong2ptr(req_info_ptr);
726977Smax.romanov@gmail.com 
727977Smax.romanov@gmail.com     msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
728977Smax.romanov@gmail.com     if (msg_str == NULL) {
729977Smax.romanov@gmail.com         return;
730977Smax.romanov@gmail.com     }
731977Smax.romanov@gmail.com 
732977Smax.romanov@gmail.com     nxt_unit_req_debug(req, "%.*s", msg_len, msg_str);
733977Smax.romanov@gmail.com 
734977Smax.romanov@gmail.com     (*env)->ReleaseStringUTFChars(env, msg, msg_str);
735977Smax.romanov@gmail.com #endif
736977Smax.romanov@gmail.com }
737977Smax.romanov@gmail.com 
738977Smax.romanov@gmail.com 
739977Smax.romanov@gmail.com static jobject JNICALL
nxt_java_Request_getResponse(JNIEnv * env,jclass cls,jlong req_info_ptr)740977Smax.romanov@gmail.com nxt_java_Request_getResponse(JNIEnv *env, jclass cls, jlong req_info_ptr)
741977Smax.romanov@gmail.com {
742977Smax.romanov@gmail.com     nxt_unit_request_info_t  *req;
743977Smax.romanov@gmail.com     nxt_java_request_data_t  *data;
744977Smax.romanov@gmail.com 
745977Smax.romanov@gmail.com     req = nxt_jlong2ptr(req_info_ptr);
746977Smax.romanov@gmail.com     data = req->data;
747977Smax.romanov@gmail.com 
748977Smax.romanov@gmail.com     return data->jresp;
749977Smax.romanov@gmail.com }
750*1157Smax.romanov@nginx.com 
751*1157Smax.romanov@nginx.com 
752*1157Smax.romanov@nginx.com static void JNICALL
nxt_java_Request_sendWsFrameBuf(JNIEnv * env,jclass cls,jlong req_info_ptr,jobject buf,jint pos,jint len,jbyte opCode,jboolean last)753*1157Smax.romanov@nginx.com nxt_java_Request_sendWsFrameBuf(JNIEnv *env, jclass cls,
754*1157Smax.romanov@nginx.com     jlong req_info_ptr, jobject buf, jint pos, jint len, jbyte opCode, jboolean last)
755*1157Smax.romanov@nginx.com {
756*1157Smax.romanov@nginx.com     nxt_unit_request_info_t  *req;
757*1157Smax.romanov@nginx.com 
758*1157Smax.romanov@nginx.com     req = nxt_jlong2ptr(req_info_ptr);
759*1157Smax.romanov@nginx.com     uint8_t *b = (*env)->GetDirectBufferAddress(env, buf);
760*1157Smax.romanov@nginx.com 
761*1157Smax.romanov@nginx.com     if (b != NULL) {
762*1157Smax.romanov@nginx.com         nxt_unit_websocket_send(req, opCode, last, b + pos, len);
763*1157Smax.romanov@nginx.com 
764*1157Smax.romanov@nginx.com     } else {
765*1157Smax.romanov@nginx.com         nxt_unit_req_debug(req, "sendWsFrameBuf: b == NULL");
766*1157Smax.romanov@nginx.com     }
767*1157Smax.romanov@nginx.com }
768*1157Smax.romanov@nginx.com 
769*1157Smax.romanov@nginx.com 
770*1157Smax.romanov@nginx.com static void JNICALL
nxt_java_Request_sendWsFrameArr(JNIEnv * env,jclass cls,jlong req_info_ptr,jarray arr,jint pos,jint len,jbyte opCode,jboolean last)771*1157Smax.romanov@nginx.com nxt_java_Request_sendWsFrameArr(JNIEnv *env, jclass cls,
772*1157Smax.romanov@nginx.com     jlong req_info_ptr, jarray arr, jint pos, jint len, jbyte opCode, jboolean last)
773*1157Smax.romanov@nginx.com {
774*1157Smax.romanov@nginx.com     nxt_unit_request_info_t  *req;
775*1157Smax.romanov@nginx.com 
776*1157Smax.romanov@nginx.com     req = nxt_jlong2ptr(req_info_ptr);
777*1157Smax.romanov@nginx.com     uint8_t *b = (*env)->GetPrimitiveArrayCritical(env, arr, NULL);
778*1157Smax.romanov@nginx.com 
779*1157Smax.romanov@nginx.com     if (b != NULL) {
780*1157Smax.romanov@nginx.com         if (!nxt_unit_response_is_sent(req)) {
781*1157Smax.romanov@nginx.com             nxt_unit_response_send(req);
782*1157Smax.romanov@nginx.com         }
783*1157Smax.romanov@nginx.com 
784*1157Smax.romanov@nginx.com         nxt_unit_websocket_send(req, opCode, last, b + pos, len);
785*1157Smax.romanov@nginx.com 
786*1157Smax.romanov@nginx.com         (*env)->ReleasePrimitiveArrayCritical(env, arr, b, 0);
787*1157Smax.romanov@nginx.com 
788*1157Smax.romanov@nginx.com     } else {
789*1157Smax.romanov@nginx.com         nxt_unit_req_debug(req, "sendWsFrameArr: b == NULL");
790*1157Smax.romanov@nginx.com     }
791*1157Smax.romanov@nginx.com }
792*1157Smax.romanov@nginx.com 
793*1157Smax.romanov@nginx.com 
794*1157Smax.romanov@nginx.com static void JNICALL
nxt_java_Request_closeWs(JNIEnv * env,jclass cls,jlong req_info_ptr)795*1157Smax.romanov@nginx.com nxt_java_Request_closeWs(JNIEnv *env, jclass cls, jlong req_info_ptr)
796*1157Smax.romanov@nginx.com {
797*1157Smax.romanov@nginx.com     nxt_unit_request_info_t  *req;
798*1157Smax.romanov@nginx.com     nxt_java_request_data_t  *data;
799*1157Smax.romanov@nginx.com 
800*1157Smax.romanov@nginx.com     req = nxt_jlong2ptr(req_info_ptr);
801*1157Smax.romanov@nginx.com 
802*1157Smax.romanov@nginx.com     data = req->data;
803*1157Smax.romanov@nginx.com 
804*1157Smax.romanov@nginx.com     (*env)->DeleteGlobalRef(env, data->jresp);
805*1157Smax.romanov@nginx.com     (*env)->DeleteGlobalRef(env, data->jreq);
806*1157Smax.romanov@nginx.com 
807*1157Smax.romanov@nginx.com     nxt_unit_request_done(req, NXT_UNIT_OK);
808*1157Smax.romanov@nginx.com }
809*1157Smax.romanov@nginx.com 
810*1157Smax.romanov@nginx.com 
811*1157Smax.romanov@nginx.com void
nxt_java_Request_websocket(JNIEnv * env,jobject jreq,jobject jbuf,uint8_t opcode,uint8_t fin)812*1157Smax.romanov@nginx.com nxt_java_Request_websocket(JNIEnv *env, jobject jreq, jobject jbuf,
813*1157Smax.romanov@nginx.com     uint8_t opcode, uint8_t fin)
814*1157Smax.romanov@nginx.com {
815*1157Smax.romanov@nginx.com     (*env)->CallVoidMethod(env, jreq, nxt_java_Request_processWsFrame, jbuf, opcode, fin);
816*1157Smax.romanov@nginx.com }
817*1157Smax.romanov@nginx.com 
818*1157Smax.romanov@nginx.com 
819*1157Smax.romanov@nginx.com void
nxt_java_Request_close(JNIEnv * env,jobject jreq)820*1157Smax.romanov@nginx.com nxt_java_Request_close(JNIEnv *env, jobject jreq)
821*1157Smax.romanov@nginx.com {
822*1157Smax.romanov@nginx.com     (*env)->CallVoidMethod(env, jreq, nxt_java_Request_closeWsSession);
823*1157Smax.romanov@nginx.com }
824