[gitg] Implemented simple protection of out-of-sync diff requests



commit f30151d0d3d1985a53afb819d6807c216ff05f86
Author: Jesse van den Kieboom <jessevdk gnome org>
Date:   Sat Mar 2 00:33:29 2013 +0100

    Implemented simple protection of out-of-sync diff requests

 libgitg-gtk/gitg-gtk-diff-view-request-diff.vala   |   21 +++++++---
 .../gitg-gtk-diff-view-request-resource.vala       |    2 +
 libgitg-gtk/gitg-gtk-diff-view-request.vala        |   40 ++++++++++++++++++++
 libgitg-gtk/gitg-gtk-diff-view.vala                |   21 +++++++++-
 libgitg-gtk/resources/diff-view.js                 |    6 +-
 5 files changed, 78 insertions(+), 12 deletions(-)
---
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala 
b/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
index 32fcc51..4e14aa5 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request-diff.vala
@@ -28,16 +28,23 @@ namespace GitgGtk
                }
 
                private DiffType d_diff_type;
+               private Ggit.Diff? d_diff;
+               private Ggit.Commit? d_commit;
 
                public DiffViewRequestDiff(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
                {
                        base(view, request, uri);
-                       d_mimetype = "application/json";
 
-                       var parsed = Soup.Form.decode(uri.query);
+                       d_mimetype = "application/json";
                        d_diff_type = DiffType.DEFAULT;
 
-                       var format = parsed.lookup("format");
+                       if (has_view)
+                       {
+                               d_commit = d_view.commit;
+                               d_diff = d_view.diff;
+                       }
+
+                       var format = parameter("format");
 
                        switch (format)
                        {
@@ -281,7 +288,7 @@ namespace GitgGtk
                private void build_commit(Ggit.Diff? diff, Json.Builder builder, Cancellable? cancellable)
                {
                        builder.set_member_name("commit");
-                       commit_to_json(builder, d_view.commit);
+                       commit_to_json(builder, d_commit);
                }
 
                private InputStream? run_diff(Ggit.Diff? diff, Cancellable? cancellable) throws GLib.Error
@@ -296,7 +303,7 @@ namespace GitgGtk
 
                        builder.begin_object();
 
-                       if (d_view.commit != null && d_diff_type != DiffType.DIFF_ONLY)
+                       if (d_commit != null && d_diff_type != DiffType.DIFF_ONLY)
                        {
                                build_commit(diff, builder, cancellable);
                        }
@@ -331,12 +338,12 @@ namespace GitgGtk
 
                public override InputStream? run_async(Cancellable? cancellable) throws GLib.Error
                {
-                       if (d_view == null)
+                       if (!has_view)
                        {
                                throw new IOError.NOT_FOUND("Could not find diff view with corresponding id");
                        }
 
-                       return run_diff(d_view.diff, cancellable);
+                       return run_diff(d_diff, cancellable);
                }
        }
 }
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala 
b/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
index f7a4df1..fbe3779 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request-resource.vala
@@ -25,6 +25,8 @@ namespace GitgGtk
                public DiffViewRequestResource(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
                {
                        base(view, request, uri);
+                       d_view = null;
+                       d_hasView = false;
                }
 
                private File ensure_resource()
diff --git a/libgitg-gtk/gitg-gtk-diff-view-request.vala b/libgitg-gtk/gitg-gtk-diff-view-request.vala
index e889098..acc11c7 100644
--- a/libgitg-gtk/gitg-gtk-diff-view-request.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view-request.vala
@@ -25,6 +25,8 @@ namespace GitgGtk
                protected string? d_mimetype;
                protected int64 d_size;
                protected WebKit.URISchemeRequest d_request;
+               private HashTable<string, string>? d_form;
+               protected bool d_hasView;
 
                public DiffViewRequest(DiffView? view, WebKit.URISchemeRequest request, Soup.URI uri)
                {
@@ -33,6 +35,44 @@ namespace GitgGtk
                        d_uri = uri;
                        d_size = -1;
                        d_mimetype = null;
+                       d_form = null;
+                       d_hasView = view != null;
+               }
+
+               public Soup.URI uri
+               {
+                       get { return d_uri; }
+               }
+
+               public bool has_view
+               {
+                       get { return d_hasView; }
+               }
+
+               public void finish_empty()
+               {
+                       d_request.finish(new MemoryInputStream(),
+                                        get_content_length(),
+                                        get_content_type());
+               }
+
+               public string? parameter(string v)
+               {
+                       if (d_form == null)
+                       {
+                               var q = d_uri.get_query();
+
+                               if (q != null)
+                               {
+                                       d_form = Soup.Form.decode(q);
+                               }
+                               else
+                               {
+                                       d_form = new HashTable<string, string>(str_hash, str_equal);
+                               }
+                       }
+
+                       return d_form.lookup(v);
                }
 
                public DiffView? view
diff --git a/libgitg-gtk/gitg-gtk-diff-view.vala b/libgitg-gtk/gitg-gtk-diff-view.vala
index fd553c4..b3fdcae 100644
--- a/libgitg-gtk/gitg-gtk-diff-view.vala
+++ b/libgitg-gtk/gitg-gtk-diff-view.vala
@@ -34,6 +34,7 @@ namespace GitgGtk
 
                private Cancellable d_cancellable;
                private bool d_loaded;
+               private ulong d_diffid;
 
                public Ggit.Diff? diff
                {
@@ -150,7 +151,21 @@ namespace GitgGtk
 
                public void request(DiffViewRequest request)
                {
-                       request.run(d_cancellable);
+                       var did = request.parameter("diffid");
+
+                       if (did != null)
+                       {
+                               uint64 i = uint64.parse(did);
+                               
+                               if (i == d_diffid)
+                               {
+                                       request.run(d_cancellable);
+                                       return;
+                               }
+                       }
+
+                       // Still finish request, but with something bogus
+                       request.finish_empty();
                }
 
                private void update_font_settings()
@@ -256,6 +271,8 @@ namespace GitgGtk
                        d_cancellable.cancel();
                        d_cancellable = new Cancellable();
 
+                       ++d_diffid;
+
                        if (d_commit != null)
                        {
                                d_diff = d_commit.get_diff(options);
@@ -263,7 +280,7 @@ namespace GitgGtk
 
                        if (d_diff != null)
                        {
-                               run_javascript.begin("update_diff();", d_cancellable, (obj, res) => {
+                               run_javascript.begin("update_diff(%lu);".printf(d_diffid), d_cancellable, 
(obj, res) => {
                                        try
                                        {
                                                run_javascript.end(res);
diff --git a/libgitg-gtk/resources/diff-view.js b/libgitg-gtk/resources/diff-view.js
index 4822505..3624cfb 100644
--- a/libgitg-gtk/resources/diff-view.js
+++ b/libgitg-gtk/resources/diff-view.js
@@ -115,7 +115,7 @@ function write_commit(commit)
 var html_builder_worker = 0;
 var html_builder_tick = 0;
 
-function update_diff()
+function update_diff(id)
 {
        if (html_builder_worker)
        {
@@ -169,7 +169,7 @@ function update_diff()
 
        // Load the diff asynchronously
        html_builder_worker.postMessage({
-               url: "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&format=diff_only",
+               url: "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id + 
"&format=diff_only",
                settings: settings,
                hunk_template: hunk_template,
        });
@@ -187,7 +187,7 @@ function update_diff()
        }
 
        t = (new Date()).getTime();
-       r.open("GET", "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&format=commit_only");
+       r.open("GET", "gitg-diff:/diff/?t=" + t + "&viewid=" + params.viewid + "&diffid=" + id + 
"&format=commit_only");
        r.send();
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]