@@ -138,19 +138,45 @@ func (p *HTTPPool) PickPeer(key string) (ProtoGetter, bool) {
138
138
return nil , false
139
139
}
140
140
141
- func (p * HTTPPool ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
142
- // Parse request.
141
+ func (p * HTTPPool ) parseRequest (r * http.Request ) (string , string , bool ) {
143
142
if ! strings .HasPrefix (r .URL .Path , p .opts .BasePath ) {
144
143
panic ("HTTPPool serving unexpected path: " + r .URL .Path )
145
144
}
146
145
parts := strings .SplitN (r .URL .Path [len (p .opts .BasePath ):], "/" , 2 )
147
146
if len (parts ) != 2 {
148
- http .Error (w , "bad request" , http .StatusBadRequest )
149
- return
147
+ return "" , "" , false
150
148
}
151
149
groupName := parts [0 ]
152
150
key := parts [1 ]
153
151
152
+ queries , err := url .ParseQuery (r .URL .RawQuery )
153
+ if err != nil {
154
+ // Still accept groupName and key in path.
155
+ return groupName , key , true
156
+ }
157
+
158
+ var uerr error
159
+ if queries .Get ("escaped" ) == "true" {
160
+ groupName , uerr = url .QueryUnescape (groupName )
161
+ if uerr != nil {
162
+ return "" , "" , false
163
+ }
164
+ key , uerr = url .QueryUnescape (key )
165
+ if uerr != nil {
166
+ return "" , "" , false
167
+ }
168
+ }
169
+
170
+ return groupName , key , true
171
+ }
172
+
173
+ func (p * HTTPPool ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
174
+ groupName , key , ok := p .parseRequest (r )
175
+ if ! ok {
176
+ http .Error (w , "bad request" , http .StatusBadRequest )
177
+ return
178
+ }
179
+
154
180
// Fetch the value for this group/key.
155
181
group := GetGroup (groupName )
156
182
if group == nil {
@@ -191,7 +217,7 @@ var bufferPool = sync.Pool{
191
217
192
218
func (h * httpGetter ) Get (context Context , in * pb.GetRequest , out * pb.GetResponse ) error {
193
219
u := fmt .Sprintf (
194
- "%v%v/%v" ,
220
+ "%v%v/%v?escaped=true " ,
195
221
h .baseURL ,
196
222
url .QueryEscape (in .GetGroup ()),
197
223
url .QueryEscape (in .GetKey ()),
0 commit comments