Question

Using ASM ByteCode library , add a request header (UUID) when a HttpUrlConnection ic created Below is my code - Also am getting the output === > This is Http CONNECT Method!. But dont know how to add a Header?

    package com.eg.agent;

    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;

    public class EgHttpMethodVisitorAdapter extends MethodVisitor {

        private String methodName;
        private String className;
        private String description;

        public EgHttpMethodVisitorAdapter(MethodVisitor mv , String  methodName , String description , String className) {
            super(Opcodes.ASM4, mv);
            this.methodName = methodName;
            this.className = className;
            this.description = description;
        }

        public void visitCode() {
            super.visitCode();
            System.out.println("\t [HTTP URL CONNECTION - Method Name]"+methodName +"  Class NAME: "+className  + "  DESC :"+description);
            boolean isConnect =  false;
            if(methodName.equals("connect") && description.equals("()V"))
                isConnect = true;
            if(isConnect) {
                mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
                mv.visitLdcInsn (" ====> This is Http CONNECT Method!");
                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream","println", "(Ljava/lang/String;)V");
            }
        }

        public void visitMaxs(int maxStack, int maxLocals) {
            super.visitMaxs(maxStack + 4, maxLocals);
        }
    }
Was it helpful?

Solution

I have solved it.. attached the visitCode method.

    public void visitCode() {
        super.visitCode();
        boolean isConnect =  false;
        if(methodName.equals("connect") && description.equals("()V"))
            isConnect = true;

        if(isConnect) {
            // Dynamically add UUID .. 
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/util/UUID", "randomUUID", "()Ljava/util/UUID;");
            mv.visitVarInsn(Opcodes.ASTORE, 3); 
            mv.visitVarInsn(Opcodes.ALOAD, 0);  
            mv.visitLdcInsn("GUID");
            mv.visitVarInsn(Opcodes.ALOAD, 3); 
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/UUID", "toString", "()Ljava/lang/String;");
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/net/HttpURLConnection", "addRequestProperty", "(Ljava/lang/String;Ljava/lang/String;)V");
            mv.visitCode();
        }
    }

OTHER TIPS

You may find ASM FAQ Question 11 helpful.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top