URL path for info cache cache_type_path
@@ -94,6 +94,8 @@ | ||
94 | 94 | return INI_START_RET; |
95 | 95 | } |
96 | 96 | static int _INI_START_RET(tsProtocol *,stdObject*); |
97 | + | |
98 | +extern int debug_flag; | |
97 | 99 | TS_STATE(INI_START_RET) |
98 | 100 | { |
99 | 101 | stdStringTree<tsProtocol> * list; |
@@ -100,11 +102,23 @@ | ||
100 | 102 | tsProtocol * target; |
101 | 103 | TS_PROTO_NAME * name; |
102 | 104 | char * ap; |
105 | + | |
103 | 106 | if ( (ev->type&TSE_MASK) != TSE_RETURN ) |
104 | 107 | return 0; |
105 | 108 | list = dynamic_cast<stdStringTree<tsProtocol>*>(ev->msg_obj); |
106 | 109 | this->relative_len = this->est->relative->length(); |
107 | - target = list->search(this,_INI_START_RET); | |
110 | + | |
111 | + | |
112 | +int match_len; | |
113 | + target = list | |
114 | + ->search(&match_len, | |
115 | + est->relative->percent_decode()); | |
116 | +/* | |
117 | + target = list | |
118 | + ->search(this,_INI_START_RET); | |
119 | +*/ | |
120 | + | |
121 | + | |
108 | 122 | this->parent->release_list(ifThis); |
109 | 123 | if ( target == 0 ) { |
110 | 124 | printf("ERROR NOTHING PROTOCOL(gtItem) %s\n", |
@@ -178,6 +178,7 @@ | ||
178 | 178 | this->type = param->type; |
179 | 179 | break; |
180 | 180 | case GTITEM_ROOT: |
181 | + cache_type_match = 1; | |
181 | 182 | this->type = param->type; |
182 | 183 | REF_SET(this->gtItem_polling, |
183 | 184 | NEW stdQue<gtItem>(&this->gtItem_polling,ifThis)); |
@@ -374,7 +375,7 @@ | ||
374 | 375 | int |
375 | 376 | gtItem_::establish(tsProtocol * ac,tsProtocolArgsEstablish * est) |
376 | 377 | { |
377 | - co_gtItem * itm; | |
378 | +co_gtItem * itm; | |
378 | 379 | this->setCoRoutine(NEW co_gtItem(ifThis,dynamic_cast<tsProtocolArgsEstablishHTTP*>(est))); |
379 | 380 | return 0; |
380 | 381 | } |
@@ -60,6 +60,7 @@ | ||
60 | 60 | |
61 | 61 | int get_list(tinyState * caller); |
62 | 62 | int release_list(tinyState * caller); |
63 | + int get_cache_type_match(); | |
63 | 64 | |
64 | 65 | static int coRoutineDestroyed(tinyState * THIS,stdEvent * ev); |
65 | 66 | int coRoutineDestroyed(stdEvent * ev); |
@@ -335,6 +336,12 @@ | ||
335 | 336 | } |
336 | 337 | |
337 | 338 | int |
339 | +tsProtocol_::get_cache_type_match() | |
340 | +{ | |
341 | + return cache_type_match; | |
342 | +} | |
343 | + | |
344 | +int | |
338 | 345 | tsProtocol_::complete_path() |
339 | 346 | { |
340 | 347 | if ( list == 0 ) |
@@ -357,7 +364,8 @@ | ||
357 | 364 | return ifThis; |
358 | 365 | int mlen; |
359 | 366 | tsProtocol * ret; |
360 | - ret = list->search(&mlen,path); | |
367 | + ret = list | |
368 | + ->search(&mlen,path); | |
361 | 369 | if ( ret == 0 ) |
362 | 370 | return 0; |
363 | 371 | return ret->search_path(&path[mlen]); |
@@ -581,7 +589,8 @@ | ||
581 | 589 | return rDO|ACT_TS_PROTOCOL_FIN_REQUEST; |
582 | 590 | } |
583 | 591 | |
584 | - ent = this->list->search( | |
592 | + ent = this->list | |
593 | + ->search( | |
585 | 594 | NEW tsProtocolArgs(uargs,1),ts_search_proto); |
586 | 595 | if ( ent ) { |
587 | 596 | ent->attach(ifThis,uargs); |
@@ -606,7 +615,8 @@ | ||
606 | 615 | return rDO|ACT_TS_PROTOCOL_FIN_REQUEST; |
607 | 616 | } |
608 | 617 | ent = (*ts_proto_table[i].constructor)(ifThis,uargs); |
609 | - this->list->ins(uargs->n.addr,ent); | |
618 | + this->list->ins((NEW stdString(uargs->n.addr))->percent_decode(), | |
619 | + ent,ent->get_cache_type_match()); | |
610 | 620 | return ACT_TS_PROTOCOL_ATTACH_RET; |
611 | 621 | } |
612 | 622 | TS_STATE(ACT_TS_PROTOCOL_ATTACH_RET) |
@@ -88,6 +88,7 @@ | ||
88 | 88 | stdQueueElement<tsCachePath> * elp; |
89 | 89 | tsProtocolArgsEstablishHTTP * est; |
90 | 90 | tsCachePath * tcp; |
91 | + | |
91 | 92 | if ( wait_helper == 0 ) |
92 | 93 | return 0; |
93 | 94 | est = dynamic_cast<tsProtocolArgsEstablishHTTP*>(_est); |
@@ -117,6 +118,7 @@ | ||
117 | 118 | TS_STATE_TYPE ret; |
118 | 119 | stdQueueElement<tsCachePath> * elp; |
119 | 120 | tsCachePath * tcp; |
121 | + | |
120 | 122 | if ( wait_helper == 0 || destroy_flag || ref_destroy_flag ) { |
121 | 123 | REF_SET(*ret_tcp,0); |
122 | 124 | REF_SET(*ret_est,0); |
@@ -142,9 +142,20 @@ | ||
142 | 142 | char * ap; |
143 | 143 | if ( (ev->type&TSE_MASK) != TSE_RETURN ) |
144 | 144 | return 0; |
145 | + | |
145 | 146 | list = dynamic_cast<stdStringTree<tsProtocol>*>(ev->msg_obj); |
147 | + | |
148 | +int match_len; | |
146 | 149 | tt_target = dynamic_cast<tsProtocol*> |
147 | - (tt = list->search(this,_ACT_RETRY_RET)); | |
150 | + (tt = list | |
151 | + ->search(&match_len, | |
152 | + est->path->percent_decode())); | |
153 | +/* | |
154 | + tt_target = dynamic_cast<tsProtocol*> | |
155 | + (tt = list | |
156 | + ->search(this,_ACT_RETRY_RET)); | |
157 | +*/ | |
158 | + | |
148 | 159 | list_ts->release_list(ifThis); |
149 | 160 | REF_SET(list_ts,0); |
150 | 161 | if ( tt_target == 0 ) { |
@@ -242,6 +253,10 @@ | ||
242 | 253 | } |
243 | 254 | TS_STATE(FIN_START_SLAVE) |
244 | 255 | { |
256 | + return rDO|FIN_tsProtocolHTTPcacheHelper_ALL_START; | |
257 | +} | |
258 | +TS_STATE(FIN_tsProtocolHTTPcacheHelper_ALL_START) | |
259 | +{ | |
245 | 260 | REF_SET(est,0); |
246 | 261 | REF_SET(target,0); |
247 | 262 | REF_SET(relative,0); |
@@ -10,8 +10,10 @@ | ||
10 | 10 | stdStringTreeBase::stdStringTreeBase( |
11 | 11 | stdString * str, |
12 | 12 | stdObject * obj, |
13 | + int partial_flag, | |
13 | 14 | stdStringTreeBase * list) |
14 | 15 | { |
16 | + this->partial_flag = partial_flag; | |
15 | 17 | REF_SET(this->str,str); |
16 | 18 | REF_SET(this->obj,obj); |
17 | 19 | REF_SET(this->list,list); |
@@ -27,12 +29,16 @@ | ||
27 | 29 | |
28 | 30 | |
29 | 31 | void |
30 | -stdStringTreeBase::reset(int len,stdObject * obj,stdStringTreeBase * list) | |
32 | +stdStringTreeBase::reset( | |
33 | + int len, | |
34 | + stdObject * obj, | |
35 | + int partial_flag, | |
36 | + stdStringTreeBase * list) | |
31 | 37 | { |
32 | 38 | str->length(len); |
33 | 39 | REF_SET(this->list,list); |
34 | - | |
35 | 40 | REF_SET(this->obj,obj); |
41 | + this->partial_flag = partial_flag; | |
36 | 42 | } |
37 | 43 | |
38 | 44 | void |
@@ -65,12 +71,13 @@ | ||
65 | 71 | |
66 | 72 | |
67 | 73 | void |
68 | -stdStringTreeBase::ins(const char * ix,int len,stdObject * obj) | |
74 | +stdStringTreeBase::ins(const char * ix,int len,stdObject * obj,int partial_flag) | |
69 | 75 | { |
70 | 76 | stdStringTreeBase * elp; |
71 | 77 | |
72 | 78 | if ( ix[0] == 0 || len == 0 ) { |
73 | 79 | REF_SET(this->obj,obj); |
80 | + this->partial_flag = partial_flag; | |
74 | 81 | return; |
75 | 82 | } |
76 | 83 | for ( elp = list ; elp ; elp = elp->next ) { |
@@ -79,7 +86,7 @@ | ||
79 | 86 | if ( clen == 0 ) |
80 | 87 | continue; |
81 | 88 | if ( clen == xlen ) { |
82 | - elp->ins(&ix[clen],len-clen,obj); | |
89 | + elp->ins(&ix[clen],len-clen,obj,partial_flag); | |
83 | 90 | return; |
84 | 91 | } |
85 | 92 | if ( clen == len ) { |
@@ -87,8 +94,9 @@ | ||
87 | 94 | t = NEW stdStringTreeBase( |
88 | 95 | NEW stdString(elp->str->get_str(),clen,xlen), |
89 | 96 | elp->obj, |
97 | + elp->partial_flag, | |
90 | 98 | elp->list); |
91 | - elp->reset(clen,obj,t); | |
99 | + elp->reset(clen,obj,partial_flag,t); | |
92 | 100 | return; |
93 | 101 | } |
94 | 102 | else { |
@@ -96,12 +104,14 @@ | ||
96 | 104 | t1 = NEW stdStringTreeBase( |
97 | 105 | NEW stdString(elp->str->get_str(),clen,xlen), |
98 | 106 | elp->obj, |
107 | + elp->partial_flag, | |
99 | 108 | elp->list); |
100 | - elp->reset(clen,0,t1); | |
109 | + elp->reset(clen,0,0,t1); | |
101 | 110 | |
102 | 111 | t2 = NEW stdStringTreeBase( |
103 | 112 | NEW stdString(ix,clen,len), |
104 | 113 | obj, |
114 | + partial_flag, | |
105 | 115 | 0); |
106 | 116 | REF_SET(t1->next,t2); |
107 | 117 | return; |
@@ -111,6 +121,7 @@ | ||
111 | 121 | t1 = NEW stdStringTreeBase( |
112 | 122 | NEW stdString(ix,0,len), |
113 | 123 | obj, |
124 | + partial_flag, | |
114 | 125 | 0); |
115 | 126 | REF_SET(t1->next,list); |
116 | 127 | REF_SET(list,t1); |
@@ -117,15 +128,15 @@ | ||
117 | 128 | } |
118 | 129 | |
119 | 130 | void |
120 | -stdStringTreeBase::ins(const char * str,stdObject * obj) | |
131 | +stdStringTreeBase::ins(const char * str,stdObject * obj,int partial_flag) | |
121 | 132 | { |
122 | - ins(str,strlen(str),obj); | |
133 | + ins(str,strlen(str),obj,partial_flag); | |
123 | 134 | } |
124 | 135 | |
125 | 136 | void |
126 | -stdStringTreeBase::ins(stdString * key,stdObject * obj) | |
137 | +stdStringTreeBase::ins(stdString * key,stdObject * obj,int partial_flag) | |
127 | 138 | { |
128 | - ins(key->get_str(),key->length(),obj); | |
139 | + ins(key->get_str(),key->length(),obj,partial_flag); | |
129 | 140 | } |
130 | 141 | |
131 | 142 | stdObject * |
@@ -150,9 +161,16 @@ | ||
150 | 161 | stdStringTreeBase::search(const char * key,int len,stdObject * olast,const char ** m_ptr) |
151 | 162 | { |
152 | 163 | stdStringTreeBase * k; |
164 | + | |
153 | 165 | if ( this->obj ) { |
154 | - olast = this->obj; | |
155 | - *m_ptr = key; | |
166 | + if ( len == 0 || key[0] == 0 ) { | |
167 | + *m_ptr = key; | |
168 | + return this->obj; | |
169 | + } | |
170 | + if ( this->partial_flag ) { | |
171 | + olast = this->obj; | |
172 | + *m_ptr = key; | |
173 | + } | |
156 | 174 | } |
157 | 175 | if ( len == 0 || key[0] == 0 ) |
158 | 176 | return olast; |
@@ -272,6 +290,7 @@ | ||
272 | 290 | if ( len == 0 || key[0] == 0 ) { |
273 | 291 | ret = obj; |
274 | 292 | REF_SET(obj,0) |
293 | + partial_flag = 0; | |
275 | 294 | return ret; |
276 | 295 | } |
277 | 296 | for ( elpp = &list ; *elpp ; elpp = &elp->next ) { |
@@ -292,6 +311,7 @@ | ||
292 | 311 | REF_SET(elp->str, |
293 | 312 | elp->str->add(elp->list->str)); |
294 | 313 | REF_SET(elp->obj,elp->list->obj); |
314 | + elp->partial_flag = elp->list->partial_flag; | |
295 | 315 | REF_SET(elp->list,elp->list->list); |
296 | 316 | } |
297 | 317 | return ret; |
@@ -321,7 +341,8 @@ | ||
321 | 341 | { |
322 | 342 | stdStringTreeBase * elp; |
323 | 343 | if ( path ) { |
324 | - ::printf("%s %s*%s %p\n",msg,path->get_str(),STR_NULL(str)->get_str(),obj); | |
344 | + ::printf("%s %s*%s %p %i\n",msg,path->get_str(),STR_NULL(str)->get_str(),obj, | |
345 | + partial_flag); | |
325 | 346 | path = path->add("*")->add(str); |
326 | 347 | } |
327 | 348 | else { |
@@ -15,14 +15,27 @@ | ||
15 | 15 | |
16 | 16 | |
17 | 17 | protected: |
18 | - stdStringTreeBase(stdString * str,stdObject * obj,stdStringTreeBase * list); | |
19 | - void match(int * clen_p,int * xlen_p,stdStringTreeBase * elp,const char * ix,int len); | |
20 | - void reset(int len,stdObject * obj,stdStringTreeBase * list); | |
18 | + stdStringTreeBase( | |
19 | + stdString * str, | |
20 | + stdObject * obj, | |
21 | + int partial_flag, | |
22 | + stdStringTreeBase * list); | |
23 | + void match( | |
24 | + int * clen_p, | |
25 | + int * xlen_p, | |
26 | + stdStringTreeBase * elp, | |
27 | + const char * ix, | |
28 | + int len); | |
29 | + void reset( | |
30 | + int len, | |
31 | + stdObject * obj, | |
32 | + int partial_flag, | |
33 | + stdStringTreeBase * list); | |
21 | 34 | |
22 | 35 | void count(int * acc); |
23 | - void ins(const char * key,stdObject * obj); | |
24 | - void ins(stdString * key,stdObject * obj); | |
25 | - void ins(const char * key,int len,stdObject * obj); | |
36 | + void ins(const char * key,stdObject * obj,int partial_flag); | |
37 | + void ins(stdString * key,stdObject * obj,int partial_flag); | |
38 | + void ins(const char * key,int len,stdObject * obj,int partial_flag); | |
26 | 39 | |
27 | 40 | stdObject * del(const char * key); |
28 | 41 | stdObject * del(stdString * key); |
@@ -45,6 +58,8 @@ | ||
45 | 58 | stdString * str; |
46 | 59 | stdObject * obj; |
47 | 60 | stdStringTreeBase * list; |
61 | + | |
62 | + unsigned partial_flag:1; | |
48 | 63 | }; |
49 | 64 | |
50 | 65 | template<class __TYPE> |
@@ -63,11 +78,11 @@ | ||
63 | 78 | stdStringTreeBase::count(&ret); |
64 | 79 | return ret; |
65 | 80 | } |
66 | - void ins(const char * key,__TYPE * obj) { | |
67 | - stdStringTreeBase::ins(key,obj); | |
81 | + void ins(const char * key,__TYPE * obj,int p_flag) { | |
82 | + stdStringTreeBase::ins(key,obj,p_flag); | |
68 | 83 | } |
69 | - void ins(stdString * key,__TYPE * obj) { | |
70 | - stdStringTreeBase::ins(key,obj); | |
84 | + void ins(stdString * key,__TYPE * obj,int p_flag) { | |
85 | + stdStringTreeBase::ins(key,obj,p_flag); | |
71 | 86 | } |
72 | 87 | __TYPE * del(const char * key) { |
73 | 88 | return dynamic_cast<__TYPE*>(stdStringTreeBase::del(key)); |