Mantis - Hessian
Viewing Issue Advanced Details
2594 crash always 04-11-08 04:51 07-17-08 22:45
maslovalex  
 
normal  
closed 3.1.5  
fixed  
none    
none  
0002594: HessianSkeleton.invoke does not closes output stream in case of Exception
Server->Client checked exception propagation does not work because of subj.

Basically client does not receive everything to complete Exception deserialization

Notes
(0003260)
lizongbo   
07-12-08 10:33   
in 3.1.6 also have the bug ,the cause of is that:
when you use hession 2.0 by Hessian2Output&12290;
then when get HessianMetaInfoAPI or got an Exception ,Hessian2Output 's out method not executed .

so I fix the bug by an "out.cloes();" fro every "return;" in "invoke" method .

the code ifs follow:

-----------------------------
    public void invoke(Object service,
                       AbstractHessianInput in,
                       AbstractHessianOutput out) throws Exception {
        ServiceContext context = ServiceContext.getContext();

        // backward compatibility for some frameworks that don't read
        // the call type first
        in.skipOptionalCall();

        String header;
        while ((header = in.readHeader()) != null) {
            Object value = in.readObject();

            context.addHeader(header, value);
        }

        String methodName = in.readMethod();
        Method method = getMethod(methodName);

        if (method != null) {
        } else if ("_hessian_getAttribute".equals(methodName)) {
            String attrName = in.readString();
            in.completeCall();

            String value = null;

            if ("java.api.class".equals(attrName)) {
                value = getAPIClassName();
            } else if ("java.home.class".equals(attrName)) {
                value = getHomeClassName();
            } else if ("java.object.class".equals(attrName)) {
                value = getObjectClassName();
            }

            out.startReply();

            out.writeObject(value);

            out.completeReply();
            out.close();// fix bug for Hessian2Output,added by lizongbo
            return;
        } else if (method == null) {
            out.startReply();
            out.writeFault("NoSuchMethodException",
                           "The service has no method named: " + in.getMethod(),
                           null);
            out.completeReply();
            out.close();// fix bug for Hessian2Output,added by lizongbo
            return;
        }

        Class[] args = method.getParameterTypes();
        Object[] values = new Object[args.length];

        for (int i = 0; i < args.length; i++) {
            values[i] = in.readObject(args[i]);
        }

        Object result = null;

        try {
            result = method.invoke(service, values);
        } catch (Throwable e) {
            if (e instanceof InvocationTargetException) {
                e = ((InvocationTargetException) e).getTargetException();
            }

            log.log(Level.WARNING, e.toString(), e);

            out.startReply();
            out.writeFault("ServiceException", e.getMessage(), e);
            out.completeReply();
            out.close();// fix bug for Hessian2Output,added by lizongbo
            return;
        }

        // The complete call needs to be after the invoke to handle a
        // trailing InputStream
        in.completeCall();

        out.startReply();

        out.writeObject(result);

        out.completeReply();
        out.close();
    }

----------------------

(0003278)
emil   
07-17-08 22:45   
Fixed in 3.2.0

hessian/3551
hessian/3552
hessian/3553
hessian/3554