Skip to content

Commit 86dea1a

Browse files
author
zhourenjian
committed
Try to make sure that simultaneous get-requests will be executed.
(Bug: all get-requests may get "continue" response!)
1 parent f0f7626 commit 86dea1a

File tree

1 file changed

+42
-26
lines changed

1 file changed

+42
-26
lines changed

sources/net.sf.j2s.ajax/ajaxrpc/net/sf/j2s/ajax/SimpleRPCHttpServlet.java

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -389,39 +389,55 @@ private String prepareScriptRequest(HttpServletRequest req, HttpServletResponse
389389

390390
// store request in session before the request is completed
391391
HttpSession session = req.getSession();
392+
392393
String attrName = "jzn" + scriptRequestID;
393394
String attrTime = "jzt" + scriptRequestID;
394-
Object attr = session.getAttribute(attrName);
395395
String[] parts = null;
396-
if (attr == null) {
397-
parts = new String[partsCount];
398-
session.setAttribute(attrName, parts);
399-
session.setAttribute(attrTime, new Date());
400-
} else { // attr instanceof String[]
401-
parts = (String []) attr;
402-
if (partsCount != parts.length) {
403-
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
404-
return null;
396+
397+
boolean badRequest = false;
398+
boolean toContinue = false;
399+
synchronized (session) {
400+
Object attr = session.getAttribute(attrName);
401+
if (attr == null) {
402+
parts = new String[partsCount];
403+
session.setAttribute(attrName, parts);
404+
session.setAttribute(attrTime, new Date());
405+
} else { // attr instanceof String[]
406+
parts = (String []) attr;
407+
if (partsCount != parts.length) {
408+
badRequest = true;
409+
}
405410
}
406-
}
407-
parts[curPart - 1] = request;
408-
for (int i = 0; i < parts.length; i++) {
409-
if (parts[i] == null) {
410-
// not completed yet! just response and wait next request.
411-
412-
resp.setContentType("text/javascript");
413-
//resp.setCharacterEncoding("utf-8");
414-
resp.getWriter().write("net.sf.j2s.ajax.SimpleRPCRequest" +
415-
".xssNotify(\"" + scriptRequestID + "\", \"continue\");");
416-
return null;
411+
if (!badRequest) {
412+
synchronized (parts) {
413+
parts[curPart - 1] = request;
414+
for (int i = 0; i < parts.length; i++) {
415+
if (parts[i] == null) {
416+
// not completed yet! just response and wait next request.
417+
toContinue = true;
418+
break;
419+
}
420+
}
421+
}
422+
if (!toContinue) {
423+
// request is completed. return the request
424+
session.removeAttribute(attrName);
425+
session.removeAttribute(attrTime);
426+
}
417427
}
418428
}
419-
420-
// request is completed. return the request
421-
synchronized (session) {
422-
session.removeAttribute(attrName);
423-
session.removeAttribute(attrTime);
429+
if (badRequest) {
430+
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
431+
return null;
432+
}
433+
if (toContinue) {
434+
resp.setContentType("text/javascript");
435+
//resp.setCharacterEncoding("utf-8");
436+
resp.getWriter().write("net.sf.j2s.ajax.SimpleRPCRequest" +
437+
".xssNotify(\"" + scriptRequestID + "\", \"continue\");");
438+
return null;
424439
}
440+
425441
StringBuffer buf = new StringBuffer();
426442
for (int i = 0; i < parts.length; i++) {
427443
buf.append(parts[i]);

0 commit comments

Comments
 (0)