88import io .dongtai .iast .core .utils .TaintPoolUtils ;
99import io .dongtai .log .DongTaiLog ;
1010
11- import java .lang .reflect .Field ;
1211import java .lang .reflect .Method ;
1312import java .util .concurrent .atomic .AtomicInteger ;
1413
1514public class FeignService {
15+
1616 public static void solveSyncInvoke (MethodEvent event , AtomicInteger invokeIdSequencer ) {
1717 try {
18- if (event .parameterInstances .length != 1 ) {
19- return ;
20- }
18+ Object parameterInstance = event .parameterInstances [0 ];
19+
20+ Method appendHeader = parameterInstance .getClass ().getDeclaredMethod ("appendHeader" , String .class , String [].class );
21+ appendHeader .setAccessible (true );
2122
22- Object handlerObj = event .objectInstance ;
23- Field metadataField = handlerObj .getClass ().getDeclaredField ("metadata" );
24- metadataField .setAccessible (true );
25- Object metadata = metadataField .get (event .objectInstance );
26- Method templateMethod = metadata .getClass ().getMethod ("template" );
27- Object template = templateMethod .invoke (metadata );
2823
2924 // get args
3025 Object args = event .parameterInstances [0 ];
@@ -33,35 +28,28 @@ public static void solveSyncInvoke(MethodEvent event, AtomicInteger invokeIdSequ
3328 boolean hasTaint = !event .getSourceHashes ().isEmpty ();
3429 event .addParameterValue (0 , args , hasTaint );
3530
36- Method addHeaderMethod = template .getClass ().getDeclaredMethod ("header" , String .class , String [].class );
37- addHeaderMethod .setAccessible (true );
3831 // clear old traceId header
39- /*
40- 防止高并发下的treeMap修改问题,暂时可解决
41- */
42- synchronized (template ){
43- //将生成traceId下放到锁内
44- String traceId = ContextManager .nextTraceId ();
32+ //曾经的hook点在高并发下有线程安全问题,新hook点判断无此问题,除去锁
33+ String traceId = ContextManager .nextTraceId ();
34+ DongTaiLog .trace ("InvokeId is {}, request headers is {}" ,event .getInvokeId (),traceId );
35+ appendHeader .invoke (parameterInstance ,ContextManager .getHeaderKey (),new String []{});
36+ appendHeader .invoke (parameterInstance ,ContextManager .getParentKey (),new String []{});
37+ appendHeader .invoke (parameterInstance ,ContextManager .getHeaderKey (),new String []{traceId });
38+ appendHeader .invoke (parameterInstance ,ContextManager .getParentKey (),new String []{String .valueOf (EngineManager .getAgentId ())});
39+ event .traceId = traceId ;
4540
46- addHeaderMethod .invoke (template , ContextManager .getHeaderKey (), new String []{});
47- addHeaderMethod .invoke (template , ContextManager .getParentKey (), new String []{});
48- addHeaderMethod .invoke (template , ContextManager .getHeaderKey (), new String []{traceId });
49- addHeaderMethod .invoke (template , ContextManager .getParentKey (),
50- new String []{String .valueOf (EngineManager .getAgentId ())});
51- event .traceId = traceId ;
52- }
5341 // add to method pool
5442 event .source = false ;
5543 event .setCallStacks (StackUtils .createCallStack (4 ));
5644 int invokeId = invokeIdSequencer .getAndIncrement ();
5745 event .setInvokeId (invokeId );
5846 event .setPolicyType (PolicyNodeType .PROPAGATOR .getName ());
5947 EngineManager .TRACK_MAP .get ().put (invokeId , event );
60- } catch (NoSuchFieldException ignore ) {
6148 } catch (NoSuchMethodException ignore ) {
6249 } catch (Throwable e ) {
6350 DongTaiLog .debug ("solve feign invoke failed: {}, {}" ,
6451 e .getMessage (), e .getCause () != null ? e .getCause ().getMessage () : "" );
6552 }
6653 }
54+
6755}
0 commit comments