@@ -15,6 +15,22 @@ import {
15
15
logResponse
16
16
} from './SensitiveLogger' ;
17
17
18
+ const Layer = require ( 'express/lib/router/layer' ) ;
19
+
20
+ function validateParameter ( key , value ) {
21
+ if ( key == 'className' ) {
22
+ if ( value . match ( / _ ? [ A - Z a - z ] [ A - Z a - z _ 0 - 9 ] * / ) ) {
23
+ return value ;
24
+ }
25
+ } else if ( key == 'objectId' ) {
26
+ if ( value . match ( / [ A - Z a - z 0 - 9 ] + / ) ) {
27
+ return value ;
28
+ }
29
+ } else {
30
+ return value ;
31
+ }
32
+ }
33
+
18
34
export default class PromiseRouter {
19
35
// Each entry should be an object with:
20
36
// path: the path to route, in express format
@@ -69,7 +85,8 @@ export default class PromiseRouter {
69
85
this . routes . push ( {
70
86
path : path ,
71
87
method : method ,
72
- handler : handler
88
+ handler : handler ,
89
+ layer : new Layer ( path , null , handler )
73
90
} ) ;
74
91
} ;
75
92
@@ -82,36 +99,16 @@ export default class PromiseRouter {
82
99
if ( route . method != method ) {
83
100
continue ;
84
101
}
85
- // NOTE: we can only route the specific wildcards :className and
86
- // :objectId, and in that order.
87
- // This is pretty hacky but I don't want to rebuild the entire
88
- // express route matcher. Maybe there's a way to reuse its logic.
89
- var pattern = '^' + route . path + '$' ;
90
-
91
- pattern = pattern . replace ( ':className' ,
92
- '(_?[A-Za-z][A-Za-z_0-9]*)' ) ;
93
- pattern = pattern . replace ( ':objectId' ,
94
- '([A-Za-z0-9]+)' ) ;
95
- pattern = pattern . replace ( ':functionName' ,
96
- '([A-Za-z0-9_]+)' ) ;
97
-
98
- var re = new RegExp ( pattern ) ;
99
- var m = path . match ( re ) ;
100
- if ( ! m ) {
101
- continue ;
102
- }
103
- var params = { } ;
104
- if ( m [ 1 ] ) {
105
- params . className = m [ 1 ] ;
106
- }
107
- if ( m [ 2 ] ) {
108
- params . objectId = m [ 2 ] ;
109
- }
110
- if ( route . path . indexOf ( ':functionName' ) > 0 ) {
111
- params . functionName = m [ 1 ] ;
112
- }
113
102
114
- return { params : params , handler : route . handler } ;
103
+ let layer = route . layer || new Layer ( route . path , null , route . handler ) ;
104
+ let match = layer . match ( path ) ;
105
+ if ( match ) {
106
+ let params = layer . params ;
107
+ Object . keys ( params ) . forEach ( ( key ) => {
108
+ params [ key ] = validateParameter ( key , params [ key ] ) ;
109
+ } ) ;
110
+ return { params : params , handler : route . handler } ;
111
+ }
115
112
}
116
113
} ;
117
114
0 commit comments