Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrCaps.h" | 8 #include "GrCaps.h" |
| 9 #include "GrContextFactory.h" | 9 #include "GrContextFactory.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 if (redirect) { | 165 if (redirect) { |
| 166 MHD_add_response_header (response, "Location", redirectUrl); | 166 MHD_add_response_header (response, "Location", redirectUrl); |
| 167 status = MHD_HTTP_SEE_OTHER; | 167 status = MHD_HTTP_SEE_OTHER; |
| 168 } | 168 } |
| 169 | 169 |
| 170 int ret = MHD_queue_response(connection, status, response); | 170 int ret = MHD_queue_response(connection, status, response); |
| 171 MHD_destroy_response(response); | 171 MHD_destroy_response(response); |
| 172 return ret; | 172 return ret; |
| 173 } | 173 } |
| 174 | 174 |
| 175 typedef int (*UrlHandler)(Request* request, MHD_Connection* connection, | 175 class UrlHandler { |
| 176 const char* upload_data, size_t* upload_data_size); | 176 public: |
| 177 virtual ~UrlHandler() {} | |
| 178 virtual bool canHandle(const char* method, const char* url) = 0; | |
| 179 virtual int handle(Request* request, MHD_Connection* connection, | |
| 180 const char* upload_data, size_t* upload_data_size) = 0; | |
| 181 }; | |
| 177 | 182 |
| 178 int rootHandler(Request* request, MHD_Connection* connection, | 183 class InfoHandler : public UrlHandler { |
| 179 const char* upload_data, size_t* upload_data_size) { | 184 public: |
| 180 return SendTemplate(connection); | 185 bool canHandle(const char* method, const char* url) override { |
| 181 } | 186 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && |
| 182 | 187 0 == strcmp(url, "/cmd"); |
| 183 int postHandler(Request* request, MHD_Connection* connection, | |
| 184 const char* upload_data, size_t* upload_data_size) { | |
| 185 UploadContext* uc = request->fUploadContext; | |
| 186 | |
| 187 // New connection | |
| 188 if (!uc) { | |
| 189 // TODO make this a method on request | |
| 190 uc = new UploadContext; | |
| 191 uc->connection = connection; | |
| 192 uc->fPostProcessor = MHD_create_post_processor(connection, kBufferSize, | |
| 193 &process_upload_data, uc) ; | |
| 194 SkASSERT(uc->fPostProcessor); | |
| 195 | |
| 196 request->fUploadContext = uc; | |
| 197 return MHD_YES; | |
| 198 } | 188 } |
| 199 | 189 |
| 200 // in process upload | 190 int handle(Request* request, MHD_Connection* connection, |
| 201 if (0 != *upload_data_size) { | 191 const char* upload_data, size_t* upload_data_size) override { |
| 202 SkASSERT(uc->fPostProcessor); | 192 if (request->fPicture.get()) { |
| 203 MHD_post_process(uc->fPostProcessor, upload_data, *upload_data_size); | 193 return SendJSON(connection, request->fPicture); |
| 204 *upload_data_size = 0; | 194 } |
| 205 return MHD_YES; | 195 return MHD_NO; |
| 196 } | |
| 197 }; | |
| 198 | |
| 199 class ImgHandler : public UrlHandler { | |
| 200 public: | |
| 201 bool canHandle(const char* method, const char* url) override { | |
| 202 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && | |
| 203 0 == strcmp(url, "/img"); | |
|
jcgregorio
2016/02/02 12:35:31
0 == strncmp(url, "/img", 4);
So the cache-bustin
joshualitt
2016/02/02 14:02:34
Acknowledged.
| |
| 206 } | 204 } |
| 207 | 205 |
| 208 // end of upload | 206 int handle(Request* request, MHD_Connection* connection, |
| 209 MHD_destroy_post_processor(uc->fPostProcessor); | 207 const char* upload_data, size_t* upload_data_size) override { |
| 210 uc->fPostProcessor = nullptr; | 208 if (request->fPNG.get()) { |
| 209 SkData* data = request->fPNG.get(); | |
| 210 return SendData(connection, data, "image/png"); | |
| 211 } | |
| 212 return MHD_NO; | |
| 213 } | |
| 214 }; | |
| 211 | 215 |
| 212 // TODO response | 216 class PostHandler : public UrlHandler { |
| 213 SkString error; | 217 public: |
| 214 if (!setupAndDrawToCanvas(request, &error)) { | 218 bool canHandle(const char* method, const char* url) override { |
| 215 // TODO send error | 219 return 0 == strcmp(method, MHD_HTTP_METHOD_POST) && |
| 216 return MHD_YES; | 220 0 == strcmp(url, "/new"); |
| 217 } | 221 } |
| 218 | 222 |
| 219 return SendTemplate(connection, true, "/"); | 223 int handle(Request* request, MHD_Connection* connection, |
| 220 } | 224 const char* upload_data, size_t* upload_data_size) override { |
| 225 UploadContext* uc = request->fUploadContext; | |
| 221 | 226 |
| 222 int imgHandler(Request* request, MHD_Connection* connection, | 227 // New connection |
| 223 const char* upload_data, size_t* upload_data_size) { | 228 if (!uc) { |
| 224 if (request->fPNG.get()) { | 229 // TODO make this a method on request |
| 225 SkData* data = request->fPNG.get(); | 230 uc = new UploadContext; |
| 226 return SendData(connection, data, "image/png"); | 231 uc->connection = connection; |
| 232 uc->fPostProcessor = MHD_create_post_processor(connection, kBufferSi ze, | |
| 233 &process_upload_data, uc); | |
| 234 SkASSERT(uc->fPostProcessor); | |
| 235 | |
| 236 request->fUploadContext = uc; | |
| 237 return MHD_YES; | |
| 238 } | |
| 239 | |
| 240 // in process upload | |
| 241 if (0 != *upload_data_size) { | |
| 242 SkASSERT(uc->fPostProcessor); | |
| 243 MHD_post_process(uc->fPostProcessor, upload_data, *upload_data_size) ; | |
| 244 *upload_data_size = 0; | |
| 245 return MHD_YES; | |
| 246 } | |
| 247 | |
| 248 // end of upload | |
| 249 MHD_destroy_post_processor(uc->fPostProcessor); | |
| 250 uc->fPostProcessor = nullptr; | |
| 251 | |
| 252 // TODO response | |
| 253 SkString error; | |
| 254 if (!setupAndDrawToCanvas(request, &error)) { | |
| 255 // TODO send error | |
| 256 return MHD_YES; | |
| 257 } | |
| 258 | |
| 259 return SendTemplate(connection, true, "/"); | |
| 227 } | 260 } |
| 228 return MHD_NO; | 261 }; |
| 229 } | |
| 230 | 262 |
| 231 int infoHandler(Request* request, MHD_Connection* connection, | 263 class RootHandler : public UrlHandler { |
| 232 const char* upload_data, size_t* upload_data_size) { | 264 public: |
| 233 if (request->fPicture.get()) { | 265 bool canHandle(const char* method, const char* url) override { |
| 234 return SendJSON(connection, request->fPicture); | 266 return 0 == strcmp(method, MHD_HTTP_METHOD_GET) && |
| 267 0 == strcmp(url, "/"); | |
| 235 } | 268 } |
| 236 return MHD_NO; | 269 |
| 237 } | 270 int handle(Request* request, MHD_Connection* connection, |
| 271 const char* upload_data, size_t* upload_data_size) override { | |
| 272 return SendTemplate(connection); | |
| 273 } | |
| 274 }; | |
| 238 | 275 |
| 239 class UrlManager { | 276 class UrlManager { |
| 240 public: | 277 public: |
| 241 UrlManager() { | 278 UrlManager() { |
| 242 // Register handlers | 279 // Register handlers |
| 243 fHandlers.push_back({MHD_HTTP_METHOD_GET, "/", rootHandler}); | 280 fHandlers.push_back(new RootHandler); |
| 244 fHandlers.push_back({MHD_HTTP_METHOD_POST, "/new", postHandler}); | 281 fHandlers.push_back(new PostHandler); |
| 245 fHandlers.push_back({MHD_HTTP_METHOD_GET, "/img", imgHandler}); | 282 fHandlers.push_back(new ImgHandler); |
| 246 fHandlers.push_back({MHD_HTTP_METHOD_GET, "/cmd", infoHandler}); | 283 fHandlers.push_back(new InfoHandler); |
| 284 } | |
| 285 | |
| 286 ~UrlManager() { | |
| 287 for (int i = 0; i < fHandlers.count(); i++) { delete fHandlers[i]; } | |
| 247 } | 288 } |
| 248 | 289 |
| 249 // This is clearly not efficient for a large number of urls and handlers | 290 // This is clearly not efficient for a large number of urls and handlers |
| 250 int invoke(Request* request, MHD_Connection* connection, const char* url, co nst char* method, | 291 int invoke(Request* request, MHD_Connection* connection, const char* url, co nst char* method, |
| 251 const char* upload_data, size_t* upload_data_size) const { | 292 const char* upload_data, size_t* upload_data_size) const { |
| 252 for (int i = 0; i < fHandlers.count(); i++) { | 293 for (int i = 0; i < fHandlers.count(); i++) { |
| 253 const Url& urlHandler = fHandlers[i]; | 294 if (fHandlers[i]->canHandle(method, url)) { |
| 254 if (0 == strcmp(method, urlHandler.fMethod) && | 295 return fHandlers[i]->handle(request, connection, upload_data, up load_data_size); |
|
jcgregorio
2016/02/02 12:35:31
Please log the method and the url to stderr.
joshualitt
2016/02/02 14:02:34
Acknowledged.
| |
| 255 0 == strcmp(url, urlHandler.fPath)) { | |
| 256 return (*urlHandler.fHandler)(request, connection, upload_da ta, | |
| 257 upload_data_size); | |
| 258 } | 296 } |
| 259 } | 297 } |
| 260 return MHD_NO; | 298 return MHD_NO; |
| 261 } | 299 } |
| 262 | 300 |
| 263 private: | 301 private: |
| 264 struct Url { | 302 SkTArray<UrlHandler*> fHandlers; |
| 265 const char* fMethod; | |
| 266 const char* fPath; | |
| 267 UrlHandler fHandler; | |
| 268 }; | |
| 269 SkTArray<Url> fHandlers; | |
| 270 }; | 303 }; |
| 271 | 304 |
| 272 const UrlManager kUrlManager; | 305 const UrlManager kUrlManager; |
| 273 | 306 |
| 274 int answer_to_connection(void* cls, struct MHD_Connection* connection, | 307 int answer_to_connection(void* cls, struct MHD_Connection* connection, |
| 275 const char* url, const char* method, const char* versio n, | 308 const char* url, const char* method, const char* versio n, |
| 276 const char* upload_data, size_t* upload_data_size, | 309 const char* upload_data, size_t* upload_data_size, |
| 277 void** con_cls) { | 310 void** con_cls) { |
| 278 SkDebugf("New %s request for %s using version %s\n", method, url, version); | 311 SkDebugf("New %s request for %s using version %s\n", method, url, version); |
| 279 | 312 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 296 MHD_stop_daemon(daemon); | 329 MHD_stop_daemon(daemon); |
| 297 return 0; | 330 return 0; |
| 298 } | 331 } |
| 299 | 332 |
| 300 #if !defined SK_BUILD_FOR_IOS | 333 #if !defined SK_BUILD_FOR_IOS |
| 301 int main(int argc, char** argv) { | 334 int main(int argc, char** argv) { |
| 302 SkCommandLineFlags::Parse(argc, argv); | 335 SkCommandLineFlags::Parse(argc, argv); |
| 303 return skiaserve_main(); | 336 return skiaserve_main(); |
| 304 } | 337 } |
| 305 #endif | 338 #endif |
| OLD | NEW |