GitHub PullRequestReviewCommentEvent at 2014-10-30 16:52:36
Repository: repose
Actor: tylerroyal
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/19618311","id":19618311,"diff_hunk":"@@ -1,196 +1,98 @@\n package org.openrepose.filters.translation.httpx;\n \n+import org.apache.commons.pool.ObjectPool;\n import org.openrepose.commons.utils.io.charset.CharacterSets;\n import org.openrepose.repose.httpx.v1.Headers;\n import org.openrepose.repose.httpx.v1.ObjectFactory;\n import org.openrepose.repose.httpx.v1.QueryParameters;\n import org.openrepose.repose.httpx.v1.RequestInformation;\n-import org.w3c.dom.Document;\n import org.xml.sax.InputSource;\n-import org.xml.sax.SAXException;\n import org.xml.sax.XMLReader;\n \n-import javax.xml.bind.*;\n-import javax.xml.parsers.DocumentBuilderFactory;\n-import javax.xml.parsers.ParserConfigurationException;\n+import javax.xml.bind.JAXBElement;\n+import javax.xml.bind.Marshaller;\n+import javax.xml.bind.Unmarshaller;\n import javax.xml.parsers.SAXParserFactory;\n-import javax.xml.transform.Source;\n import javax.xml.transform.sax.SAXSource;\n-import javax.xml.transform.stream.StreamSource;\n-import javax.xml.validation.Schema;\n-import javax.xml.validation.SchemaFactory;\n-import java.io.*;\n-import java.net.URL;\n+import java.io.ByteArrayInputStream;\n+import java.io.ByteArrayOutputStream;\n+import java.io.InputStream;\n+import java.io.OutputStream;\n \n public class HttpxMarshaller {\n \n   private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(HttpxMarshaller.class);\n-  private static final String XML_SCHEMA = \"http://www.w3.org/2001/XMLSchema\";\n-  private static final String HTTPX_SCHEMA = \"/META-INF/schema/httpx/translation-httpx.xsd\";\n-  private static final String HTTPX_PACKAGE = \"org.openrepose.repose.httpx.v1\";\n-  private JAXBContext jaxbContext;\n-  private Marshaller marshaller;\n-  private Unmarshaller unmarshaller;\n   private final SAXParserFactory parserFactory;\n   private final ObjectFactory objectFactory;\n-  private final DocumentBuilderFactory builderFactory;\n \n   public HttpxMarshaller() {\n-    builderFactory = DocumentBuilderFactory.newInstance();\n     objectFactory = new ObjectFactory();\n     parserFactory = SAXParserFactory.newInstance();\n     parserFactory.setNamespaceAware(true);\n     parserFactory.setXIncludeAware(false);\n     parserFactory.setValidating(true);\n-    parserFactory.setSchema(getSchemaSource());\n-  }\n-\n-  private Document buildDocument(InputStream xml) {\n-    try {\n-      return builderFactory.newDocumentBuilder().parse(xml);\n-    } catch (SAXException ex) {\n-      throw new HttpxException(ex);\n-    } catch (IOException ex) {\n-      throw new HttpxException(ex);\n-    } catch (ParserConfigurationException ex) {\n-      throw new HttpxException(ex);\n-    }\n-  }\n-  \n-  private Schema getSchemaSource() {\n-    SchemaFactory factory = SchemaFactory.newInstance(XML_SCHEMA);\n-    InputStream inputStream = getClass().getResourceAsStream(HTTPX_SCHEMA);\n-    URL inputURL = getClass().getResource(HTTPX_SCHEMA);\n-    Source schemaSource = new StreamSource(inputStream, inputURL.toExternalForm());\n-    try {\n-      return factory.newSchema(schemaSource);\n-    } catch (SAXException ex) {\n-      throw new HttpxException(\"Unable to load HTTPX schema\", ex);\n-    }\n-  }\n-\n-  private synchronized JAXBContext getContext() {\n-    if (jaxbContext == null) {\n-      try {\n-        jaxbContext = JAXBContext.newInstance(HTTPX_PACKAGE);\n-      } catch (JAXBException ex) {\n-        throw new HttpxException(\"Error creating JAXBContext for HTTPX\", ex);\n-      }\n-    }\n-\n-    return jaxbContext;\n-  }\n-\n-  private synchronized Marshaller getMarshaller() {\n-    if (marshaller != null) {\n-      return marshaller;\n-    }\n-\n-    try {\n-      marshaller = getContext().createMarshaller();\n-      marshaller.setSchema(getSchemaSource());\n-      return marshaller;\n-    } catch (JAXBException ex) {\n-      throw new HttpxException(\"Unable to create HTTPX marshaller\", ex);\n-    }\n-  }\n-\n-  private synchronized Unmarshaller getUnmarshaller() {\n-    if (unmarshaller != null) {\n-      return unmarshaller;\n-    }\n-\n-    try {\n-      unmarshaller = getContext().createUnmarshaller();\n-      unmarshaller.setSchema(getSchemaSource());\n-      return unmarshaller;\n-\n-    } catch (JAXBException ex) {\n-      throw new HttpxException(\"Unable to create HTTPX unmarshaller\", ex);\n-    }\n-  }\n-  \n-  public RequestInformation unmarshallRequestInformation(String xml) {\n-    return unmarshall(xml);\n+    parserFactory.setSchema(HttpxMarshallerUtility.schema);\n   }\n \n   public RequestInformation unmarshallRequestInformation(InputStream xml) {\n     return unmarshall(xml);\n   }\n \n-  public Headers unmarshallHeaders(String xml) {\n-    return unmarshall(xml);\n-  }\n-\n   public Headers unmarshallHeaders(InputStream xml) {\n     return unmarshall(xml);\n   }\n \n-  public QueryParameters unmarshallQueryParameters(String xml) {\n-    return unmarshall(xml);\n-  }\n-\n   public QueryParameters unmarshallQueryParameters(InputStream xml) {\n     return unmarshall(xml);\n   }\n \n-  public <T> T unmarshall(String xml) {\n-    return unmarshall(new ByteArrayInputStream(xml.getBytes(CharacterSets.UTF_8)));\n-  }\n-\n   public <T> T unmarshall(InputStream xml) {\n+    T rtnObject = null;\n+    Unmarshaller pooledObject = null;\n+    ObjectPool<Unmarshaller> unmarshallerPool = HttpxMarshallerUtility.unmarshallerPool;\n     try {\n-\n-      XMLReader xmlReader = parserFactory.newSAXParser().getXMLReader();\n-      SAXSource source = new SAXSource(xmlReader, new InputSource(xml));\n-      Object result = getUnmarshaller().unmarshal(source);\n-      if (result instanceof JAXBElement) {\n-        JAXBElement element = (JAXBElement) result;\n-        return (T) element.getValue();\n-      }\n-      return (T) result;\n-    } catch (SAXException ex) {\n-      throw new HttpxException(\"Error unmarshalling xml input\", ex);\n-    } catch (ParserConfigurationException ex) {\n-      throw new HttpxException(\"Error unmarshalling xml input\", ex);\n-    } catch (JAXBException ex) {\n-      throw new HttpxException(\"Error unmarshalling xml input\", ex);\n+        try {\n+            pooledObject = unmarshallerPool.borrowObject();\n+            XMLReader xmlReader = parserFactory.newSAXParser().getXMLReader();\n+            SAXSource source = new SAXSource(xmlReader, new InputSource(xml));\n+            Object result = pooledObject.unmarshal(source);\n+            if (result instanceof JAXBElement) {\n+                JAXBElement element = (JAXBElement) result;\n+                rtnObject = (T) element.getValue();\n+            } else {\n+                rtnObject = (T) result;\n+            }\n+        } catch (Exception ex) {\n+            unmarshallerPool.invalidateObject(pooledObject);\n+            pooledObject = null;\n+            throw new HttpxException(\"Error unmarshalling xml input\", ex);\n+        } finally {\n+            if (pooledObject != null) {\n+                unmarshallerPool.returnObject(pooledObject);\n+            }\n+        }\n+    } catch (HttpxException ex) {\n+        LOG.error(\"Error unmarshalling xml input\", ex);\n+        throw ex;\n+    } catch (Exception e) {\n+        LOG.error(\"Error unmarshalling xml input\", e);","path":"repose-aggregator/components/filters/translation/src/main/java/org/openrepose/filters/translation/httpx/HttpxMarshaller.java","position":null,"original_position":194,"commit_id":"2f97d03f9895ef02c8d1b5b7d71d883573cfdd4e","original_commit_id":"48146eab97857e9a69a5804296d35bdd80435418","user":{"login":"tylerroyal","id":3344417,"avatar_url":"https://avatars.githubusercontent.com/u/3344417?v=2","gravatar_id":"","url":"https://api.github.com/users/tylerroyal","html_url":"https://github.com/tylerroyal","followers_url":"https://api.github.com/users/tylerroyal/followers","following_url":"https://api.github.com/users/tylerroyal/following{/other_user}","gists_url":"https://api.github.com/users/tylerroyal/gists{/gist_id}","starred_url":"https://api.github.com/users/tylerroyal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tylerroyal/subscriptions","organizations_url":"https://api.github.com/users/tylerroyal/orgs","repos_url":"https://api.github.com/users/tylerroyal/repos","events_url":"https://api.github.com/users/tylerroyal/events{/privacy}","received_events_url":"https://api.github.com/users/tylerroyal/received_events","type":"User","site_admin":false},"body":"wasnt intentional.  should have been wrapped in the httpx exception like it was before.  fixed that.","created_at":"2014-10-30T16:52:36Z","updated_at":"2014-10-30T16:52:36Z","html_url":"https://github.com/rackerlabs/repose/pull/1151#discussion_r19618311","pull_request_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1151","_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/19618311"},"html":{"href":"https://github.com/rackerlabs/repose/pull/1151#discussion_r19618311"},"pull_request":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1151"}}},"pull_request":{"url":"https://api.github.com/repos/rackerlabs/repose/pulls/1151","id":23493376,"html_url":"https://github.com/rackerlabs/repose/pull/1151","diff_url":"https://github.com/rackerlabs/repose/pull/1151.diff","patch_url":"https://github.com/rackerlabs/repose/pull/1151.patch","issue_url":"https://api.github.com/repos/rackerlabs/repose/issues/1151","number":1151,"state":"open","locked":false,"title":"Rep 1055 httpx pooling","user":{"login":"tylerroyal","id":3344417,"avatar_url":"https://avatars.githubusercontent.com/u/3344417?v=2","gravatar_id":"","url":"https://api.github.com/users/tylerroyal","html_url":"https://github.com/tylerroyal","followers_url":"https://api.github.com/users/tylerroyal/followers","following_url":"https://api.github.com/users/tylerroyal/following{/other_user}","gists_url":"https://api.github.com/users/tylerroyal/gists{/gist_id}","starred_url":"https://api.github.com/users/tylerroyal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tylerroyal/subscriptions","organizations_url":"https://api.github.com/users/tylerroyal/orgs","repos_url":"https://api.github.com/users/tylerroyal/repos","events_url":"https://api.github.com/users/tylerroyal/events{/privacy}","received_events_url":"https://api.github.com/users/tylerroyal/received_events","type":"User","site_admin":false},"body":"Pulled out the pooling and the stuff that needed to only be created once ever (schema, jaxbcontext) to save time to a utility class.\r\nLeft in the creation of the httpxmarshaller object because the SAXParserFactory instances are not thread safe. ","created_at":"2014-10-28T21:49:52Z","updated_at":"2014-10-30T16:52:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4757f7daae5ed71a3dd9d8b4a22dd6963250972d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1151/commits","review_comments_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1151/comments","review_comment_url":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/{number}","comments_url":"https://api.github.com/repos/rackerlabs/repose/issues/1151/comments","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/2f97d03f9895ef02c8d1b5b7d71d883573cfdd4e","head":{"label":"rackerlabs:REP-1055-httpx-pooling","ref":"REP-1055-httpx-pooling","sha":"2f97d03f9895ef02c8d1b5b7d71d883573cfdd4e","user":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=2","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":1981821,"name":"repose","full_name":"rackerlabs/repose","owner":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=2","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rackerlabs/repose","description":"The powerful, programmable, API Middleware Platform","fork":false,"url":"https://api.github.com/repos/rackerlabs/repose","forks_url":"https://api.github.com/repos/rackerlabs/repose/forks","keys_url":"https://api.github.com/repos/rackerlabs/repose/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rackerlabs/repose/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rackerlabs/repose/teams","hooks_url":"https://api.github.com/repos/rackerlabs/repose/hooks","issue_events_url":"https://api.github.com/repos/rackerlabs/repose/issues/events{/number}","events_url":"https://api.github.com/repos/rackerlabs/repose/events","assignees_url":"https://api.github.com/repos/rackerlabs/repose/assignees{/user}","branches_url":"https://api.github.com/repos/rackerlabs/repose/branches{/branch}","tags_url":"https://api.github.com/repos/rackerlabs/repose/tags","blobs_url":"https://api.github.com/repos/rackerlabs/repose/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rackerlabs/repose/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rackerlabs/repose/git/refs{/sha}","trees_url":"https://api.github.com/repos/rackerlabs/repose/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/{sha}","languages_url":"https://api.github.com/repos/rackerlabs/repose/languages","stargazers_url":"https://api.github.com/repos/rackerlabs/repose/stargazers","contributors_url":"https://api.github.com/repos/rackerlabs/repose/contributors","subscribers_url":"https://api.github.com/repos/rackerlabs/repose/subscribers","subscription_url":"https://api.github.com/repos/rackerlabs/repose/subscription","commits_url":"https://api.github.com/repos/rackerlabs/repose/commits{/sha}","git_commits_url":"https://api.github.com/repos/rackerlabs/repose/git/commits{/sha}","comments_url":"https://api.github.com/repos/rackerlabs/repose/comments{/number}","issue_comment_url":"https://api.github.com/repos/rackerlabs/repose/issues/comments/{number}","contents_url":"https://api.github.com/repos/rackerlabs/repose/contents/{+path}","compare_url":"https://api.github.com/repos/rackerlabs/repose/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rackerlabs/repose/merges","archive_url":"https://api.github.com/repos/rackerlabs/repose/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rackerlabs/repose/downloads","issues_url":"https://api.github.com/repos/rackerlabs/repose/issues{/number}","pulls_url":"https://api.github.com/repos/rackerlabs/repose/pulls{/number}","milestones_url":"https://api.github.com/repos/rackerlabs/repose/milestones{/number}","notifications_url":"https://api.github.com/repos/rackerlabs/repose/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rackerlabs/repose/labels{/name}","releases_url":"https://api.github.com/repos/rackerlabs/repose/releases{/id}","created_at":"2011-07-01T04:39:34Z","updated_at":"2014-10-23T18:44:13Z","pushed_at":"2014-10-30T16:51:50Z","git_url":"git://github.com/rackerlabs/repose.git","ssh_url":"git@github.com:rackerlabs/repose.git","clone_url":"https://github.com/rackerlabs/repose.git","svn_url":"https://github.com/rackerlabs/repose","homepage":"http://www.openrepose.org/","size":117682,"stargazers_count":166,"watchers_count":166,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":52,"mirror_url":null,"open_issues_count":7,"forks":52,"open_issues":7,"watchers":166,"default_branch":"master"}},"base":{"label":"rackerlabs:master","ref":"master","sha":"cf69b888d8f75170a2a1484c51ab61966bd5e741","user":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=2","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":1981821,"name":"repose","full_name":"rackerlabs/repose","owner":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=2","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rackerlabs/repose","description":"The powerful, programmable, API Middleware Platform","fork":false,"url":"https://api.github.com/repos/rackerlabs/repose","forks_url":"https://api.github.com/repos/rackerlabs/repose/forks","keys_url":"https://api.github.com/repos/rackerlabs/repose/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rackerlabs/repose/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rackerlabs/repose/teams","hooks_url":"https://api.github.com/repos/rackerlabs/repose/hooks","issue_events_url":"https://api.github.com/repos/rackerlabs/repose/issues/events{/number}","events_url":"https://api.github.com/repos/rackerlabs/repose/events","assignees_url":"https://api.github.com/repos/rackerlabs/repose/assignees{/user}","branches_url":"https://api.github.com/repos/rackerlabs/repose/branches{/branch}","tags_url":"https://api.github.com/repos/rackerlabs/repose/tags","blobs_url":"https://api.github.com/repos/rackerlabs/repose/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rackerlabs/repose/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rackerlabs/repose/git/refs{/sha}","trees_url":"https://api.github.com/repos/rackerlabs/repose/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/{sha}","languages_url":"https://api.github.com/repos/rackerlabs/repose/languages","stargazers_url":"https://api.github.com/repos/rackerlabs/repose/stargazers","contributors_url":"https://api.github.com/repos/rackerlabs/repose/contributors","subscribers_url":"https://api.github.com/repos/rackerlabs/repose/subscribers","subscription_url":"https://api.github.com/repos/rackerlabs/repose/subscription","commits_url":"https://api.github.com/repos/rackerlabs/repose/commits{/sha}","git_commits_url":"https://api.github.com/repos/rackerlabs/repose/git/commits{/sha}","comments_url":"https://api.github.com/repos/rackerlabs/repose/comments{/number}","issue_comment_url":"https://api.github.com/repos/rackerlabs/repose/issues/comments/{number}","contents_url":"https://api.github.com/repos/rackerlabs/repose/contents/{+path}","compare_url":"https://api.github.com/repos/rackerlabs/repose/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rackerlabs/repose/merges","archive_url":"https://api.github.com/repos/rackerlabs/repose/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rackerlabs/repose/downloads","issues_url":"https://api.github.com/repos/rackerlabs/repose/issues{/number}","pulls_url":"https://api.github.com/repos/rackerlabs/repose/pulls{/number}","milestones_url":"https://api.github.com/repos/rackerlabs/repose/milestones{/number}","notifications_url":"https://api.github.com/repos/rackerlabs/repose/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rackerlabs/repose/labels{/name}","releases_url":"https://api.github.com/repos/rackerlabs/repose/releases{/id}","created_at":"2011-07-01T04:39:34Z","updated_at":"2014-10-23T18:44:13Z","pushed_at":"2014-10-30T16:51:50Z","git_url":"git://github.com/rackerlabs/repose.git","ssh_url":"git@github.com:rackerlabs/repose.git","clone_url":"https://github.com/rackerlabs/repose.git","svn_url":"https://github.com/rackerlabs/repose","homepage":"http://www.openrepose.org/","size":117682,"stargazers_count":166,"watchers_count":166,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":52,"mirror_url":null,"open_issues_count":7,"forks":52,"open_issues":7,"watchers":166,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1151"},"html":{"href":"https://github.com/rackerlabs/repose/pull/1151"},"issue":{"href":"https://api.github.com/repos/rackerlabs/repose/issues/1151"},"comments":{"href":"https://api.github.com/repos/rackerlabs/repose/issues/1151/comments"},"review_comments":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1151/comments"},"review_comment":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1151/commits"},"statuses":{"href":"https://api.github.com/repos/rackerlabs/repose/statuses/2f97d03f9895ef02c8d1b5b7d71d883573cfdd4e"}}}}