{"action":"created","comment":{"url":"https://api.github.com/repos/h2o/h2o/pulls/comments/33412973","id":33412973,"diff_hunk":"@@ -0,0 +1,156 @@\n+/*\n+ * Copyright (c) 2014,2015 DeNA Co., Ltd., Kazuho Oku, Ryosuke Matsumoto\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to\n+ * deal in the Software without restriction, including without limitation the\n+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n+ * sell copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n+ * IN THE SOFTWARE.\n+ */\n+#include \"h2o.h\"\n+#include \"h2o/mruby.h\"\n+#include <mruby.h>\n+#include <mruby/proc.h>\n+#include <mruby/compile.h>\n+#include <mruby/string.h>\n+\n+#include <errno.h>\n+\n+enum code_type {\n+    H2O_MRUBY_STRING,\n+    H2O_MRUBY_FILE\n+};\n+\n+struct st_h2o_mruby_code_t {\n+    h2o_iovec_t *path;\n+    struct RProc *proc;\n+    mrbc_context *ctx;\n+    enum code_type type;\n+    unsigned int cache;\n+};\n+\n+typedef struct st_h2o_mruby_code_t h2o_mruby_code_t;\n+\n+struct st_h2o_mruby_context_t {\n+    h2o_mruby_handler_t *handler;\n+    mrb_state *mrb;\n+\n+    /* TODO: add other hook code */\n+    h2o_mruby_code_t *h2o_mruby_handler_code;\n+};\n+\n+typedef struct st_h2o_mruby_context_t h2o_mruby_context_t;\n+\n+static void h2o_mruby_compile_code(mrb_state *mrb, h2o_iovec_t *path,\n+    h2o_mruby_code_t *code)\n+{\n+    struct mrb_parser_state* p;\n+    FILE *fp;\n+\n+    if ((fp = fopen(path->base, \"r\")) == NULL) {\n+        code->proc = NULL;\n+        fprintf(stderr, \"%s: failed to open mruby script: %s(%s)\\n\",\n+            MODULE_NAME, path->base, strerror(errno));\n+        return;\n+    }\n+\n+    code->path = path;\n+    code->ctx = mrbc_context_new(mrb);\n+    mrbc_filename(mrb, code->ctx, code->path->base);\n+    p = mrb_parse_file(mrb, fp, code->ctx);\n+    code->proc = mrb_generate_code(mrb, p);\n+\n+    fclose(fp);\n+    mrb_pool_close(p->pool);\n+}\n+\n+static void on_context_init(h2o_handler_t *_handler, h2o_context_t *ctx)\n+{\n+    h2o_mruby_handler_t *handler = (void *)_handler;\n+    h2o_mruby_context_t *handler_ctx = h2o_mem_alloc(sizeof(*handler_ctx));\n+\n+    handler_ctx->handler = handler;\n+\n+    /* ctx has a mrb_state per thread */\n+    handler_ctx->mrb = mrb_open();","path":"lib/handler/mruby.c","position":87,"original_position":87,"commit_id":"959d3efa706906684430544ab22143d2a1be6473","original_commit_id":"959d3efa706906684430544ab22143d2a1be6473","user":{"login":"cubicdaiya","id":56752,"avatar_url":"https://avatars.githubusercontent.com/u/56752?v=3","gravatar_id":"","url":"https://api.github.com/users/cubicdaiya","html_url":"https://github.com/cubicdaiya","followers_url":"https://api.github.com/users/cubicdaiya/followers","following_url":"https://api.github.com/users/cubicdaiya/following{/other_user}","gists_url":"https://api.github.com/users/cubicdaiya/gists{/gist_id}","starred_url":"https://api.github.com/users/cubicdaiya/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cubicdaiya/subscriptions","organizations_url":"https://api.github.com/users/cubicdaiya/orgs","repos_url":"https://api.github.com/users/cubicdaiya/repos","events_url":"https://api.github.com/users/cubicdaiya/events{/privacy}","received_events_url":"https://api.github.com/users/cubicdaiya/received_events","type":"User","site_admin":false},"body":"There is the lack of NULL-check for `mrb_open()`.","created_at":"2015-06-27T14:27:59Z","updated_at":"2015-06-27T14:27:59Z","html_url":"https://github.com/h2o/h2o/pull/378#discussion_r33412973","pull_request_url":"https://api.github.com/repos/h2o/h2o/pulls/378","_links":{"self":{"href":"https://api.github.com/repos/h2o/h2o/pulls/comments/33412973"},"html":{"href":"https://github.com/h2o/h2o/pull/378#discussion_r33412973"},"pull_request":{"href":"https://api.github.com/repos/h2o/h2o/pulls/378"}}},"pull_request":{"url":"https://api.github.com/repos/h2o/h2o/pulls/378","id":38459933,"html_url":"https://github.com/h2o/h2o/pull/378","diff_url":"https://github.com/h2o/h2o/pull/378.diff","patch_url":"https://github.com/h2o/h2o/pull/378.patch","issue_url":"https://api.github.com/repos/h2o/h2o/issues/378","number":378,"state":"open","locked":false,"title":"Support h2o_mruby as an optional feature","user":{"login":"matsumoto-r","id":648437,"avatar_url":"https://avatars.githubusercontent.com/u/648437?v=3","gravatar_id":"","url":"https://api.github.com/users/matsumoto-r","html_url":"https://github.com/matsumoto-r","followers_url":"https://api.github.com/users/matsumoto-r/followers","following_url":"https://api.github.com/users/matsumoto-r/following{/other_user}","gists_url":"https://api.github.com/users/matsumoto-r/gists{/gist_id}","starred_url":"https://api.github.com/users/matsumoto-r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsumoto-r/subscriptions","organizations_url":"https://api.github.com/users/matsumoto-r/orgs","repos_url":"https://api.github.com/users/matsumoto-r/repos","events_url":"https://api.github.com/users/matsumoto-r/events{/privacy}","received_events_url":"https://api.github.com/users/matsumoto-r/received_events","type":"User","site_admin":false},"body":"Thank you for providing your great software! \r\n\r\nI try to implement h2o_mruby which control h2o using mruby like [mod_mruby](https://github.com/matsumoto-r/mod_mruby) or [ngx_mruby](https://github.com/matsumoto-r/ngx_mruby).\r\n\r\n## build system\r\n\r\nh2o_mruby is an optional feature. So, the build of h2o_mruby is independent of that of h2o.\r\n\r\n- h2o_mruby build (for example MacOSX）\r\n```\r\nbrew install mruby\r\ncmake .\r\nmake h2o_mruby\r\n```\r\n\r\nIf don't have mruby, `make h2o_mruby` will fail.\r\n\r\n```\r\nmake[3]: *** No rule to make target `/usr/local/lib/libmruby.a', needed by `h2o_mruby'.  Stop.\r\nmake[2]: *** [CMakeFiles/h2o_mruby.dir/all] Error 2\r\nmake[1]: *** [CMakeFiles/h2o_mruby.dir/rule] Error 2\r\nmake: *** [h2o_mruby] Error 2\r\n```\r\n\r\nbut, `make h2o` woks well.\r\n\r\n## the feature of h2o_mruby and the plan\r\nnow, h2o_mruby have only one feature which create a response from a returned object running mruby code.\r\n\r\n - h2o.conf\r\n\r\n```yaml\r\nhosts:\r\n  \"127.0.0.1.xip.io:8080\":\r\n    paths:\r\n      /:\r\n        file.dir: examples/doc_root\r\n        mruby.handler_path: /path/to/hello.rb\r\n    access-log: /dev/stdout\r\n```\r\n\r\n- hello.rb\r\n\r\n```ruby\r\nh = \"hello\"\r\nm =  \"from h2o_mruby\"\r\nh + \" \" + m + \"\\n\"\r\n```\r\n\r\n- access via curl\r\n\r\n```\r\n$ curl 127.0.0.1:8080/\r\nhello from h2o_mruby\r\n```\r\n\r\nIn the future, I plan to implement H2O class and methods that control h2o internal using h2o CAPI like [ngx_mruby class](https://github.com/matsumoto-r/ngx_mruby/wiki/Class-and-Method#nginxrequest-class).\r\n\r\n## Performance\r\n\r\nI run the simple HTTP/1 and HTTP/2 benchmarks in my MacOSX(2.8 GHz Intel Core i7, 16 GB 1600 MHz DDR3) using `examples/doc_root/index.html` and `examples/h2o_mruby/hello.rb`.\r\n\r\n### h2o(don't use mruby)\r\n#### configuration\r\n```yaml\r\nhosts:\r\n  \"127.0.0.1.xip.io:8080\":\r\n    paths:\r\n      /:\r\n        file.dir: examples/doc_root\r\n```\r\n#### benchmark result\r\n#####  benchmark command\r\n- HTTP/1\r\n```\r\nab -k -c 100 -n 100000 http://127.0.0.1:8080/\r\n```\r\n\r\n- HTTP/2\r\n```\r\nh2load -c 100 -m 100 -n 100000 http://127.0.0.1:8080/\r\n```\r\n\r\n##### result\r\n- HTTP/1\r\n```\r\nRequests per second:    16047.24 [#/sec] (mean)\r\n```\r\n\r\n- HTTP/2\r\n```\r\nfinished in 5.36s, 18674 req/s, 3.52MB/s\r\n```\r\n\r\nhmm, in the MacOSX, the result of serving file is not very good. It may be environmental dependency problem.\r\n\r\n### h2o_mruby\r\n#### configuration\r\n```yaml\r\nhosts:\r\n  \"127.0.0.1.xip.io:8080\":\r\n    paths:\r\n      /:\r\n        file.dir: examples/doc_root\r\n        mruby.handler_path: examples/h2o_mruby/hello.rb\r\n```\r\n\r\n#### benchmark result\r\n#####  benchmark command\r\n- HTTP/1\r\n```\r\nab -k -c 100 -n 100000 http://127.0.0.1:8080/\r\n```\r\n\r\n- HTTP/2\r\n```\r\nh2load -c 100 -m 100 -n 2000000 http://127.0.0.1:8080/\r\n```\r\n\r\n##### result\r\n- HTTP/1\r\n```\r\nRequests per second:    81452.00 [#/sec] (mean)\r\n```\r\n\r\n- HTTP/2\r\n```\r\nfinished in 4.95s, 403654 req/s, 16.56MB/s\r\n```\r\n\r\nIt's very fast.\r\n\r\n----\r\n\r\nWhat are your thoughts on that?","created_at":"2015-06-24T16:18:23Z","updated_at":"2015-06-27T14:28:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e4e7e8ce63c44ca3aa826f5ad5c3ec90b7e6be0c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/h2o/h2o/pulls/378/commits","review_comments_url":"https://api.github.com/repos/h2o/h2o/pulls/378/comments","review_comment_url":"https://api.github.com/repos/h2o/h2o/pulls/comments{/number}","comments_url":"https://api.github.com/repos/h2o/h2o/issues/378/comments","statuses_url":"https://api.github.com/repos/h2o/h2o/statuses/959d3efa706906684430544ab22143d2a1be6473","head":{"label":"matsumoto-r:h2o-mruby","ref":"h2o-mruby","sha":"959d3efa706906684430544ab22143d2a1be6473","user":{"login":"matsumoto-r","id":648437,"avatar_url":"https://avatars.githubusercontent.com/u/648437?v=3","gravatar_id":"","url":"https://api.github.com/users/matsumoto-r","html_url":"https://github.com/matsumoto-r","followers_url":"https://api.github.com/users/matsumoto-r/followers","following_url":"https://api.github.com/users/matsumoto-r/following{/other_user}","gists_url":"https://api.github.com/users/matsumoto-r/gists{/gist_id}","starred_url":"https://api.github.com/users/matsumoto-r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsumoto-r/subscriptions","organizations_url":"https://api.github.com/users/matsumoto-r/orgs","repos_url":"https://api.github.com/users/matsumoto-r/repos","events_url":"https://api.github.com/users/matsumoto-r/events{/privacy}","received_events_url":"https://api.github.com/users/matsumoto-r/received_events","type":"User","site_admin":false},"repo":{"id":28449800,"name":"h2o","full_name":"matsumoto-r/h2o","owner":{"login":"matsumoto-r","id":648437,"avatar_url":"https://avatars.githubusercontent.com/u/648437?v=3","gravatar_id":"","url":"https://api.github.com/users/matsumoto-r","html_url":"https://github.com/matsumoto-r","followers_url":"https://api.github.com/users/matsumoto-r/followers","following_url":"https://api.github.com/users/matsumoto-r/following{/other_user}","gists_url":"https://api.github.com/users/matsumoto-r/gists{/gist_id}","starred_url":"https://api.github.com/users/matsumoto-r/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsumoto-r/subscriptions","organizations_url":"https://api.github.com/users/matsumoto-r/orgs","repos_url":"https://api.github.com/users/matsumoto-r/repos","events_url":"https://api.github.com/users/matsumoto-r/events{/privacy}","received_events_url":"https://api.github.com/users/matsumoto-r/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/matsumoto-r/h2o","description":"HTTP server / library implementation with support for HTTP/1, HTTP/2, websocket","fork":true,"url":"https://api.github.com/repos/matsumoto-r/h2o","forks_url":"https://api.github.com/repos/matsumoto-r/h2o/forks","keys_url":"https://api.github.com/repos/matsumoto-r/h2o/keys{/key_id}","collaborators_url":"https://api.github.com/repos/matsumoto-r/h2o/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/matsumoto-r/h2o/teams","hooks_url":"https://api.github.com/repos/matsumoto-r/h2o/hooks","issue_events_url":"https://api.github.com/repos/matsumoto-r/h2o/issues/events{/number}","events_url":"https://api.github.com/repos/matsumoto-r/h2o/events","assignees_url":"https://api.github.com/repos/matsumoto-r/h2o/assignees{/user}","branches_url":"https://api.github.com/repos/matsumoto-r/h2o/branches{/branch}","tags_url":"https://api.github.com/repos/matsumoto-r/h2o/tags","blobs_url":"https://api.github.com/repos/matsumoto-r/h2o/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/matsumoto-r/h2o/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/matsumoto-r/h2o/git/refs{/sha}","trees_url":"https://api.github.com/repos/matsumoto-r/h2o/git/trees{/sha}","statuses_url":"https://api.github.com/repos/matsumoto-r/h2o/statuses/{sha}","languages_url":"https://api.github.com/repos/matsumoto-r/h2o/languages","stargazers_url":"https://api.github.com/repos/matsumoto-r/h2o/stargazers","contributors_url":"https://api.github.com/repos/matsumoto-r/h2o/contributors","subscribers_url":"https://api.github.com/repos/matsumoto-r/h2o/subscribers","subscription_url":"https://api.github.com/repos/matsumoto-r/h2o/subscription","commits_url":"https://api.github.com/repos/matsumoto-r/h2o/commits{/sha}","git_commits_url":"https://api.github.com/repos/matsumoto-r/h2o/git/commits{/sha}","comments_url":"https://api.github.com/repos/matsumoto-r/h2o/comments{/number}","issue_comment_url":"https://api.github.com/repos/matsumoto-r/h2o/issues/comments{/number}","contents_url":"https://api.github.com/repos/matsumoto-r/h2o/contents/{+path}","compare_url":"https://api.github.com/repos/matsumoto-r/h2o/compare/{base}...{head}","merges_url":"https://api.github.com/repos/matsumoto-r/h2o/merges","archive_url":"https://api.github.com/repos/matsumoto-r/h2o/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/matsumoto-r/h2o/downloads","issues_url":"https://api.github.com/repos/matsumoto-r/h2o/issues{/number}","pulls_url":"https://api.github.com/repos/matsumoto-r/h2o/pulls{/number}","milestones_url":"https://api.github.com/repos/matsumoto-r/h2o/milestones{/number}","notifications_url":"https://api.github.com/repos/matsumoto-r/h2o/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/matsumoto-r/h2o/labels{/name}","releases_url":"https://api.github.com/repos/matsumoto-r/h2o/releases{/id}","created_at":"2014-12-24T13:30:41Z","updated_at":"2015-06-23T18:58:38Z","pushed_at":"2015-06-25T09:21:54Z","git_url":"git://github.com/matsumoto-r/h2o.git","ssh_url":"git@github.com:matsumoto-r/h2o.git","clone_url":"https://github.com/matsumoto-r/h2o.git","svn_url":"https://github.com/matsumoto-r/h2o","homepage":"http://blog.kazuhooku.com/search/label/H2O","size":11286,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"h2o:master","ref":"master","sha":"a905e5138a41e322b6970e44f614c3d0132e2171","user":{"login":"h2o","id":9275116,"avatar_url":"https://avatars.githubusercontent.com/u/9275116?v=3","gravatar_id":"","url":"https://api.github.com/users/h2o","html_url":"https://github.com/h2o","followers_url":"https://api.github.com/users/h2o/followers","following_url":"https://api.github.com/users/h2o/following{/other_user}","gists_url":"https://api.github.com/users/h2o/gists{/gist_id}","starred_url":"https://api.github.com/users/h2o/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/h2o/subscriptions","organizations_url":"https://api.github.com/users/h2o/orgs","repos_url":"https://api.github.com/users/h2o/repos","events_url":"https://api.github.com/users/h2o/events{/privacy}","received_events_url":"https://api.github.com/users/h2o/received_events","type":"Organization","site_admin":false},"repo":{"id":23029617,"name":"h2o","full_name":"h2o/h2o","owner":{"login":"h2o","id":9275116,"avatar_url":"https://avatars.githubusercontent.com/u/9275116?v=3","gravatar_id":"","url":"https://api.github.com/users/h2o","html_url":"https://github.com/h2o","followers_url":"https://api.github.com/users/h2o/followers","following_url":"https://api.github.com/users/h2o/following{/other_user}","gists_url":"https://api.github.com/users/h2o/gists{/gist_id}","starred_url":"https://api.github.com/users/h2o/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/h2o/subscriptions","organizations_url":"https://api.github.com/users/h2o/orgs","repos_url":"https://api.github.com/users/h2o/repos","events_url":"https://api.github.com/users/h2o/events{/privacy}","received_events_url":"https://api.github.com/users/h2o/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/h2o/h2o","description":"H2O - the optimized HTTP/1, HTTP/2 server","fork":false,"url":"https://api.github.com/repos/h2o/h2o","forks_url":"https://api.github.com/repos/h2o/h2o/forks","keys_url":"https://api.github.com/repos/h2o/h2o/keys{/key_id}","collaborators_url":"https://api.github.com/repos/h2o/h2o/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/h2o/h2o/teams","hooks_url":"https://api.github.com/repos/h2o/h2o/hooks","issue_events_url":"https://api.github.com/repos/h2o/h2o/issues/events{/number}","events_url":"https://api.github.com/repos/h2o/h2o/events","assignees_url":"https://api.github.com/repos/h2o/h2o/assignees{/user}","branches_url":"https://api.github.com/repos/h2o/h2o/branches{/branch}","tags_url":"https://api.github.com/repos/h2o/h2o/tags","blobs_url":"https://api.github.com/repos/h2o/h2o/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/h2o/h2o/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/h2o/h2o/git/refs{/sha}","trees_url":"https://api.github.com/repos/h2o/h2o/git/trees{/sha}","statuses_url":"https://api.github.com/repos/h2o/h2o/statuses/{sha}","languages_url":"https://api.github.com/repos/h2o/h2o/languages","stargazers_url":"https://api.github.com/repos/h2o/h2o/stargazers","contributors_url":"https://api.github.com/repos/h2o/h2o/contributors","subscribers_url":"https://api.github.com/repos/h2o/h2o/subscribers","subscription_url":"https://api.github.com/repos/h2o/h2o/subscription","commits_url":"https://api.github.com/repos/h2o/h2o/commits{/sha}","git_commits_url":"https://api.github.com/repos/h2o/h2o/git/commits{/sha}","comments_url":"https://api.github.com/repos/h2o/h2o/comments{/number}","issue_comment_url":"https://api.github.com/repos/h2o/h2o/issues/comments{/number}","contents_url":"https://api.github.com/repos/h2o/h2o/contents/{+path}","compare_url":"https://api.github.com/repos/h2o/h2o/compare/{base}...{head}","merges_url":"https://api.github.com/repos/h2o/h2o/merges","archive_url":"https://api.github.com/repos/h2o/h2o/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/h2o/h2o/downloads","issues_url":"https://api.github.com/repos/h2o/h2o/issues{/number}","pulls_url":"https://api.github.com/repos/h2o/h2o/pulls{/number}","milestones_url":"https://api.github.com/repos/h2o/h2o/milestones{/number}","notifications_url":"https://api.github.com/repos/h2o/h2o/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/h2o/h2o/labels{/name}","releases_url":"https://api.github.com/repos/h2o/h2o/releases{/id}","created_at":"2014-08-16T23:59:03Z","updated_at":"2015-06-27T08:58:23Z","pushed_at":"2015-06-27T06:37:38Z","git_url":"git://github.com/h2o/h2o.git","ssh_url":"git@github.com:h2o/h2o.git","clone_url":"https://github.com/h2o/h2o.git","svn_url":"https://github.com/h2o/h2o","homepage":"https://h2o.examp1e.net","size":18485,"stargazers_count":4437,"watchers_count":4437,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":297,"mirror_url":null,"open_issues_count":107,"forks":297,"open_issues":107,"watchers":4437,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/h2o/h2o/pulls/378"},"html":{"href":"https://github.com/h2o/h2o/pull/378"},"issue":{"href":"https://api.github.com/repos/h2o/h2o/issues/378"},"comments":{"href":"https://api.github.com/repos/h2o/h2o/issues/378/comments"},"review_comments":{"href":"https://api.github.com/repos/h2o/h2o/pulls/378/comments"},"review_comment":{"href":"https://api.github.com/repos/h2o/h2o/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/h2o/h2o/pulls/378/commits"},"statuses":{"href":"https://api.github.com/repos/h2o/h2o/statuses/959d3efa706906684430544ab22143d2a1be6473"}}}}