diff --git a/comments.json b/comments.json index 7bef77ad..28816136 100644 --- a/comments.json +++ b/comments.json @@ -8,5 +8,20 @@ "id": 1420070400000, "author": "Paul O’Shannessy", "text": "React is *great*!" + }, + { + "id": 1464988635157, + "author": "ben", + "text": "*abc*" + }, + { + "id": 1464988636500, + "author": "ben", + "text": "*abc*" + }, + { + "id": 1464988717637, + "author": "evil", + "text": "alert(1)" } -] +] \ No newline at end of file diff --git a/package.json b/package.json index e7491981..bf3360a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "name": "react-tutorial", "version": "0.0.0", + "private": true, + "license": "see LICENSE file", "description": "Code from the React tutorial.", "main": "server.js", "dependencies": { diff --git a/public/css/base.css b/public/css/base.css index bf382be3..c8cc35f7 100644 --- a/public/css/base.css +++ b/public/css/base.css @@ -23,7 +23,7 @@ code { font-family: "Bitstream Vera Sans Mono", Consolas, Courier, monospace; font-size: 12px; margin: 0 2px; - padding: 0px 5px; + padding: 0 5px; } h1, h2, h3, h4 { @@ -35,9 +35,6 @@ h1, h2, h3, h4 { h1 { border-bottom: 1px solid #ddd; font-size: 2.5em; - font-weight: bold; - margin: 0 0 15px; - padding: 0; } h2 { diff --git a/public/index.html b/public/index.html index c6494446..eb201204 100644 --- a/public/index.html +++ b/public/index.html @@ -5,11 +5,11 @@ React Tutorial - - - - - + + + + +
diff --git a/public/scripts/example.js b/public/scripts/example.js index c249427a..6493fea9 100644 --- a/public/scripts/example.js +++ b/public/scripts/example.js @@ -12,7 +12,8 @@ var Comment = React.createClass({ rawMarkup: function() { - var rawMarkup = marked(this.props.children.toString(), {sanitize: true}); + var md = new Remarkable(); + var rawMarkup = md.render(this.props.children.toString()); return { __html: rawMarkup }; }, diff --git a/server.go b/server.go index 2224328d..934a4cfc 100644 --- a/server.go +++ b/server.go @@ -84,11 +84,13 @@ func handleComments(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Access-Control-Allow-Origin", "*") io.Copy(w, bytes.NewReader(commentData)) case "GET": w.Header().Set("Content-Type", "application/json") w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Access-Control-Allow-Origin", "*") // stream the contents of the file to the response io.Copy(w, bytes.NewReader(commentData)) diff --git a/server.js b/server.js index ac87898a..b5a7218a 100644 --- a/server.js +++ b/server.js @@ -24,13 +24,23 @@ app.use('/', express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); +// Additional middleware which will set headers that we need on each request. +app.use(function(req, res, next) { + // Set permissive CORS header - this allows this server to be used only as + // an API server in conjunction with something like webpack-dev-server. + res.setHeader('Access-Control-Allow-Origin', '*'); + + // Disable caching so we'll always get the latest comments. + res.setHeader('Cache-Control', 'no-cache'); + next(); +}); + app.get('/api/comments', function(req, res) { fs.readFile(COMMENTS_FILE, function(err, data) { if (err) { console.error(err); process.exit(1); } - res.setHeader('Cache-Control', 'no-cache'); res.json(JSON.parse(data)); }); }); @@ -56,7 +66,6 @@ app.post('/api/comments', function(req, res) { console.error(err); process.exit(1); } - res.setHeader('Cache-Control', 'no-cache'); res.json(comments); }); }); diff --git a/server.php b/server.php index 6b8880c8..e510136b 100644 --- a/server.php +++ b/server.php @@ -27,11 +27,11 @@ function routeRequest() { - $comments = file_get_contents('comments.json'); $uri = $_SERVER['REQUEST_URI']; if ($uri == '/') { echo file_get_contents('./public/index.html'); } elseif (preg_match('/\/api\/comments(\?.*)?/', $uri)) { + $comments = file_get_contents('comments.json'); if($_SERVER['REQUEST_METHOD'] === 'POST') { $commentsDecoded = json_decode($comments, true); $commentsDecoded[] = [ @@ -45,6 +45,7 @@ function routeRequest() } header('Content-Type: application/json'); header('Cache-Control: no-cache'); + header('Access-Control-Allow-Origin: *'); echo $comments; } else { return false; diff --git a/server.pl b/server.pl index 517e1621..c3212b9c 100644 --- a/server.pl +++ b/server.pl @@ -19,6 +19,8 @@ any [qw(GET POST)] => '/api/comments' => sub { my $self = shift; my $comments = decode_json (do { local(@ARGV,$/) = 'comments.json';<> }); + $self->res->headers->cache_control('no-cache'); + $self->res->headers->access_control_allow_origin('*'); if ($self->req->method eq 'POST') { diff --git a/server.py b/server.py index 451fbacd..03c6213d 100644 --- a/server.py +++ b/server.py @@ -16,21 +16,29 @@ app = Flask(__name__, static_url_path='', static_folder='public') app.add_url_rule('/', 'root', lambda: app.send_static_file('index.html')) + @app.route('/api/comments', methods=['GET', 'POST']) def comments_handler(): - - with open('comments.json', 'r') as file: - comments = json.loads(file.read()) + with open('comments.json', 'r') as f: + comments = json.loads(f.read()) if request.method == 'POST': - newComment = request.form.to_dict() - newComment['id'] = int(time.time() * 1000) - comments.append(newComment) + new_comment = request.form.to_dict() + new_comment['id'] = int(time.time() * 1000) + comments.append(new_comment) + + with open('comments.json', 'w') as f: + f.write(json.dumps(comments, indent=4, separators=(',', ': '))) - with open('comments.json', 'w') as file: - file.write(json.dumps(comments, indent=4, separators=(',', ': '))) + return Response( + json.dumps(comments), + mimetype='application/json', + headers={ + 'Cache-Control': 'no-cache', + 'Access-Control-Allow-Origin': '*' + } + ) - return Response(json.dumps(comments), mimetype='application/json', headers={'Cache-Control': 'no-cache'}) if __name__ == '__main__': - app.run(port=int(os.environ.get("PORT",3000))) + app.run(port=int(os.environ.get("PORT", 3000)), debug=True) diff --git a/server.rb b/server.rb index eed401ae..698f4339 100644 --- a/server.rb +++ b/server.rb @@ -11,7 +11,9 @@ require 'webrick' require 'json' -port = ENV['PORT'].nil? ? 3000 : ENV['PORT'].to_i +# default port to 3000 or overwrite with PORT variable by running +# $ PORT=3001 ruby server.rb +port = ENV['PORT'] ? ENV['PORT'].to_i : 3000 puts "Server started: http://localhost:#{port}/" @@ -25,7 +27,7 @@ # Assume it's well formed comment = { id: (Time.now.to_f * 1000).to_i } req.query.each do |key, value| - comment[key] = value.force_encoding('UTF-8') + comment[key] = value.force_encoding('UTF-8') unless key == 'id' end comments << comment File.write( @@ -38,6 +40,7 @@ # always return json res['Content-Type'] = 'application/json' res['Cache-Control'] = 'no-cache' + res['Access-Control-Allow-Origin'] = '*' res.body = JSON.generate(comments) end