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