| OLD | NEW | 
|---|
| 1 package main | 1 package main | 
| 2 | 2 | 
| 3 import ( | 3 import ( | 
| 4         "bytes" | 4         "bytes" | 
| 5         "crypto/md5" | 5         "crypto/md5" | 
| 6         "database/sql" | 6         "database/sql" | 
| 7         "encoding/base64" | 7         "encoding/base64" | 
| 8         "encoding/json" | 8         "encoding/json" | 
| 9         "flag" | 9         "flag" | 
| 10         "fmt" | 10         "fmt" | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 27         RESULT_COMPILE = `c++ -DSK_GAMMA_SRGB -DSK_GAMMA_APPLY_TO_A8 -DSK_SCALAR
     _TO_FLOAT_EXCLUDED -DSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1 -DSK_SUPPORT_GPU=0 -D
     SK_SUPPORT_OPENCL=0 -DSK_FORCE_DISTANCEFIELD_FONTS=0 -DSK_SCALAR_IS_FLOAT -DSK_C
     AN_USE_FLOAT -DSK_SAMPLES_FOR_X -DSK_BUILD_FOR_UNIX -DSK_USE_POSIX_THREADS -DSK_
     SYSTEM_ZLIB=1 -DSK_DEBUG -DSK_DEVELOPER=1 -I../../src/core -I../../src/images -I
     ../../tools/flags -I../../include/config -I../../include/core -I../../include/pa
     thops -I../../include/pipe -I../../include/effects -I../../include/ports -I../..
     /src/sfnt -I../../include/utils -I../../src/utils -I../../include/images -g -fno
     -exceptions -fstrict-aliasing -Wall -Wextra -Winit-self -Wpointer-arith -Wno-unu
     sed-parameter -Wno-c++11-extensions -Werror -m64 -fno-rtti -Wnon-virtual-dtor -c
      ../../../cache/%s.cpp -o ../../../cache/%s.o` | 27         RESULT_COMPILE = `c++ -DSK_GAMMA_SRGB -DSK_GAMMA_APPLY_TO_A8 -DSK_SCALAR
     _TO_FLOAT_EXCLUDED -DSK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1 -DSK_SUPPORT_GPU=0 -D
     SK_SUPPORT_OPENCL=0 -DSK_FORCE_DISTANCEFIELD_FONTS=0 -DSK_SCALAR_IS_FLOAT -DSK_C
     AN_USE_FLOAT -DSK_SAMPLES_FOR_X -DSK_BUILD_FOR_UNIX -DSK_USE_POSIX_THREADS -DSK_
     SYSTEM_ZLIB=1 -DSK_DEBUG -DSK_DEVELOPER=1 -I../../src/core -I../../src/images -I
     ../../tools/flags -I../../include/config -I../../include/core -I../../include/pa
     thops -I../../include/pipe -I../../include/effects -I../../include/ports -I../..
     /src/sfnt -I../../include/utils -I../../src/utils -I../../include/images -g -fno
     -exceptions -fstrict-aliasing -Wall -Wextra -Winit-self -Wpointer-arith -Wno-unu
     sed-parameter -Wno-c++11-extensions -Werror -m64 -fno-rtti -Wnon-virtual-dtor -c
      ../../../cache/%s.cpp -o ../../../cache/%s.o` | 
| 28         LINK           = `c++ -m64 -lstdc++ -lm -o ../../../inout/%s -Wl,--start
     -group ../../../cache/%s.o obj/experimental/webtry/webtry.main.o obj/gyp/libflag
     s.a libskia_images.a libskia_core.a libskia_effects.a obj/gyp/libjpeg.a obj/gyp/
     libwebp_dec.a obj/gyp/libwebp_demux.a obj/gyp/libwebp_dsp.a obj/gyp/libwebp_enc.
     a obj/gyp/libwebp_utils.a libskia_utils.a libskia_opts.a libskia_opts_ssse3.a li
     bskia_ports.a libskia_sfnt.a -Wl,--end-group -lpng -lz -lgif -lpthread -lfontcon
     fig -ldl -lfreetype` | 28         LINK           = `c++ -m64 -lstdc++ -lm -o ../../../inout/%s -Wl,--start
     -group ../../../cache/%s.o obj/experimental/webtry/webtry.main.o obj/gyp/libflag
     s.a libskia_images.a libskia_core.a libskia_effects.a obj/gyp/libjpeg.a obj/gyp/
     libwebp_dec.a obj/gyp/libwebp_demux.a obj/gyp/libwebp_dsp.a obj/gyp/libwebp_enc.
     a obj/gyp/libwebp_utils.a libskia_utils.a libskia_opts.a libskia_opts_ssse3.a li
     bskia_ports.a libskia_sfnt.a -Wl,--end-group -lpng -lz -lgif -lpthread -lfontcon
     fig -ldl -lfreetype` | 
| 29         DEFAULT_SAMPLE = `SkPaint p; | 29         DEFAULT_SAMPLE = `SkPaint p; | 
| 30 p.setColor(SK_ColorRED); | 30 p.setColor(SK_ColorRED); | 
| 31 p.setAntiAlias(true); | 31 p.setAntiAlias(true); | 
| 32 p.setStyle(SkPaint::kStroke_Style); | 32 p.setStyle(SkPaint::kStroke_Style); | 
| 33 p.setStrokeWidth(10); | 33 p.setStrokeWidth(10); | 
| 34 | 34 | 
| 35 canvas->drawLine(20, 20, 100, 100, p); | 35 canvas->drawLine(20, 20, 100, 100, p); | 
| 36 ` | 36 ` | 
|  | 37         // Don't increase above 2^16 w/o altering the db tables to accept someth
     ing bigger than TEXT. | 
|  | 38         MAX_TRY_SIZE = 64000 | 
| 37 ) | 39 ) | 
| 38 | 40 | 
| 39 var ( | 41 var ( | 
| 40         // codeTemplate is the cpp code template the user's code is copied into. | 42         // codeTemplate is the cpp code template the user's code is copied into. | 
| 41         codeTemplate *template.Template = nil | 43         codeTemplate *template.Template = nil | 
| 42 | 44 | 
| 43         // indexTemplate is the main index.html page we serve. | 45         // indexTemplate is the main index.html page we serve. | 
| 44         indexTemplate *htemplate.Template = nil | 46         indexTemplate *htemplate.Template = nil | 
| 45 | 47 | 
| 46         // recentTemplate is a list of recent  images. | 48         // recentTemplate is a list of recent  images. | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 108         req.Header.Add("X-Google-Metadata-Request", "True") | 110         req.Header.Add("X-Google-Metadata-Request", "True") | 
| 109         if resp, err := client.Do(req); err == nil { | 111         if resp, err := client.Do(req); err == nil { | 
| 110                 password, err := ioutil.ReadAll(resp.Body) | 112                 password, err := ioutil.ReadAll(resp.Body) | 
| 111                 if err != nil { | 113                 if err != nil { | 
| 112                         log.Printf("ERROR: Failed to read password from metadata
      server: %q\n", err) | 114                         log.Printf("ERROR: Failed to read password from metadata
      server: %q\n", err) | 
| 113                         panic(err) | 115                         panic(err) | 
| 114                 } | 116                 } | 
| 115                 // The IP address of the database is found here: | 117                 // The IP address of the database is found here: | 
| 116                 //    https://console.developers.google.com/project/31977622648/
     sql/instances/webtry/overview | 118                 //    https://console.developers.google.com/project/31977622648/
     sql/instances/webtry/overview | 
| 117                 // And 3306 is the default port for MySQL. | 119                 // And 3306 is the default port for MySQL. | 
| 118 »       »       db, err = sql.Open("mysql", fmt.Sprintf("webtry:%s@tcp(173.194.8
     3.52:3306)/webtry", password)) | 120 »       »       db, err = sql.Open("mysql", fmt.Sprintf("webtry:%s@tcp(173.194.8
     3.52:3306)/webtry?parseTime=true", password)) | 
| 119                 if err != nil { | 121                 if err != nil { | 
| 120                         log.Printf("ERROR: Failed to open connection to SQL serv
     er: %q\n", err) | 122                         log.Printf("ERROR: Failed to open connection to SQL serv
     er: %q\n", err) | 
| 121                         panic(err) | 123                         panic(err) | 
| 122                 } | 124                 } | 
| 123         } else { | 125         } else { | 
| 124                 // Fallback to sqlite for local use. | 126                 // Fallback to sqlite for local use. | 
| 125                 db, err = sql.Open("sqlite3", "./webtry.db") | 127                 db, err = sql.Open("sqlite3", "./webtry.db") | 
| 126                 if err != nil { | 128                 if err != nil { | 
| 127                         log.Printf("ERROR: Failed to open: %q\n", err) | 129                         log.Printf("ERROR: Failed to open: %q\n", err) | 
| 128                         panic(err) | 130                         panic(err) | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 285                         log.Printf("Error: failed to fetch from database: %q", e
     rr) | 287                         log.Printf("Error: failed to fetch from database: %q", e
     rr) | 
| 286                         continue | 288                         continue | 
| 287                 } | 289                 } | 
| 288                 recent = append(recent, Try{Hash: hash, CreateTS: create_ts.Form
     at("2006-02-01")}) | 290                 recent = append(recent, Try{Hash: hash, CreateTS: create_ts.Form
     at("2006-02-01")}) | 
| 289         } | 291         } | 
| 290         if err := recentTemplate.Execute(w, Recent{Tries: recent}); err != nil { | 292         if err := recentTemplate.Execute(w, Recent{Tries: recent}); err != nil { | 
| 291                 log.Printf("ERROR: Failed to expand template: %q\n", err) | 293                 log.Printf("ERROR: Failed to expand template: %q\n", err) | 
| 292         } | 294         } | 
| 293 } | 295 } | 
| 294 | 296 | 
|  | 297 // hasPreProcessor returns true if any line in the code begins with a # char. | 
|  | 298 func hasPreProcessor(code string) bool { | 
|  | 299         lines := strings.Split(code, "\n") | 
|  | 300         for _, s := range lines { | 
|  | 301                 if strings.HasPrefix(strings.TrimSpace(s), "#") { | 
|  | 302                         return true | 
|  | 303                 } | 
|  | 304         } | 
|  | 305         return false | 
|  | 306 } | 
|  | 307 | 
| 295 // mainHandler handles the GET and POST of the main page. | 308 // mainHandler handles the GET and POST of the main page. | 
| 296 func mainHandler(w http.ResponseWriter, r *http.Request) { | 309 func mainHandler(w http.ResponseWriter, r *http.Request) { | 
| 297         log.Printf("Main Handler: %q\n", r.URL.Path) | 310         log.Printf("Main Handler: %q\n", r.URL.Path) | 
| 298         if r.Method == "GET" { | 311         if r.Method == "GET" { | 
| 299                 code := DEFAULT_SAMPLE | 312                 code := DEFAULT_SAMPLE | 
| 300                 match := directLink.FindStringSubmatch(r.URL.Path) | 313                 match := directLink.FindStringSubmatch(r.URL.Path) | 
| 301                 if len(match) == 2 && r.URL.Path != "/" { | 314                 if len(match) == 2 && r.URL.Path != "/" { | 
| 302                         hash := match[1] | 315                         hash := match[1] | 
| 303                         if db == nil { | 316                         if db == nil { | 
| 304                                 http.NotFound(w, r) | 317                                 http.NotFound(w, r) | 
| 305                                 return | 318                                 return | 
| 306                         } | 319                         } | 
| 307                         // Update 'code' with the code found in the database. | 320                         // Update 'code' with the code found in the database. | 
| 308                         if err := db.QueryRow("SELECT code FROM webtry WHERE has
     h=?", hash).Scan(&code); err != nil { | 321                         if err := db.QueryRow("SELECT code FROM webtry WHERE has
     h=?", hash).Scan(&code); err != nil { | 
| 309                                 http.NotFound(w, r) | 322                                 http.NotFound(w, r) | 
| 310                                 return | 323                                 return | 
| 311                         } | 324                         } | 
| 312                 } | 325                 } | 
| 313                 // Expand the template. | 326                 // Expand the template. | 
| 314                 if err := indexTemplate.Execute(w, userCode{UserCode: code}); er
     r != nil { | 327                 if err := indexTemplate.Execute(w, userCode{UserCode: code}); er
     r != nil { | 
| 315                         log.Printf("ERROR: Failed to expand template: %q\n", err
     ) | 328                         log.Printf("ERROR: Failed to expand template: %q\n", err
     ) | 
| 316                 } | 329                 } | 
| 317         } else if r.Method == "POST" { | 330         } else if r.Method == "POST" { | 
| 318                 w.Header().Set("Content-Type", "application/json") | 331                 w.Header().Set("Content-Type", "application/json") | 
| 319 »       »       b, err := ioutil.ReadAll(r.Body) | 332 »       »       buf := bytes.NewBuffer(make([]byte, 0, MAX_TRY_SIZE)) | 
|  | 333 »       »       n, err := buf.ReadFrom(r.Body) | 
| 320                 if err != nil { | 334                 if err != nil { | 
| 321                         reportError(w, r, err, "Failed to read a request body.") | 335                         reportError(w, r, err, "Failed to read a request body.") | 
| 322                         return | 336                         return | 
| 323                 } | 337                 } | 
| 324 »       »       code := string(b) | 338 »       »       if n == MAX_TRY_SIZE { | 
|  | 339 »       »       »       err := fmt.Errorf("Code length equal to, or exceeded, %d
     ", MAX_TRY_SIZE) | 
|  | 340 »       »       »       reportError(w, r, err, "Code too large.") | 
|  | 341 »       »       »       return | 
|  | 342 »       »       } | 
|  | 343 »       »       code := string(buf.Bytes()) | 
|  | 344 »       »       if hasPreProcessor(code) { | 
|  | 345 »       »       »       err := fmt.Errorf("Found preprocessor macro in code.") | 
|  | 346 »       »       »       reportError(w, r, err, "Preprocessor macros aren't allow
     ed.") | 
|  | 347 »       »       »       return | 
|  | 348 »       »       } | 
| 325                 hash, err := expandCode(LineNumbers(code)) | 349                 hash, err := expandCode(LineNumbers(code)) | 
| 326                 if err != nil { | 350                 if err != nil { | 
| 327                         reportError(w, r, err, "Failed to write the code to comp
     ile.") | 351                         reportError(w, r, err, "Failed to write the code to comp
     ile.") | 
| 328                         return | 352                         return | 
| 329                 } | 353                 } | 
| 330                 writeToDatabase(hash, code) | 354                 writeToDatabase(hash, code) | 
| 331                 message, err := doCmd(fmt.Sprintf(RESULT_COMPILE, hash, hash), t
     rue) | 355                 message, err := doCmd(fmt.Sprintf(RESULT_COMPILE, hash, hash), t
     rue) | 
| 332                 if err != nil { | 356                 if err != nil { | 
| 333                         reportError(w, r, err, "Failed to compile the code:\n"+m
     essage) | 357                         reportError(w, r, err, "Failed to compile the code:\n"+m
     essage) | 
| 334                         return | 358                         return | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 377 } | 401 } | 
| 378 | 402 | 
| 379 func main() { | 403 func main() { | 
| 380         flag.Parse() | 404         flag.Parse() | 
| 381         http.HandleFunc("/i/", imageHandler) | 405         http.HandleFunc("/i/", imageHandler) | 
| 382         http.HandleFunc("/recent/", recentHandler) | 406         http.HandleFunc("/recent/", recentHandler) | 
| 383         http.HandleFunc("/css/", cssHandler) | 407         http.HandleFunc("/css/", cssHandler) | 
| 384         http.HandleFunc("/", mainHandler) | 408         http.HandleFunc("/", mainHandler) | 
| 385         log.Fatal(http.ListenAndServe(*port, nil)) | 409         log.Fatal(http.ListenAndServe(*port, nil)) | 
| 386 } | 410 } | 
| OLD | NEW | 
|---|