GitHub PullRequestReviewCommentEvent at 2014-08-14 16:04:24
Repository: certificate-transparency
Actor: eranmes
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/google/certificate-transparency/pulls/comments/16247354","id":16247354,"diff_hunk":"@@ -71,6 +73,163 @@\n     return builder.build();\n   }\n \n+\n+  /**\n+   * Parses an entry retrieved from Log.\n+   * @param merkleTreeLeaf MerkleTreeLeaf structure, byte stream of binary encoding.\n+   * @param extraData extra data,  byte stream of binary encoding.\n+   * @return {@link ParsedLogEntry}\n+   */\n+  public static ParsedLogEntry parseLogEntry(InputStream merkleTreeLeaf, InputStream extraData) {\n+    Ct.MerkleTreeLeaf treeLeaf = parseMerkleTreeLeaf(merkleTreeLeaf);\n+    Ct.LogEntry.Builder logEntryBuilder = Ct.LogEntry.newBuilder();\n+\n+    Ct.LogEntryType entryType = treeLeaf.getTimestampedEntry().getEntryType();\n+\n+    if (entryType == Ct.LogEntryType.X509_ENTRY) {\n+      Ct.X509ChainEntry x509EntryChain = parseX509ChainEntry(extraData,\n+        treeLeaf.getTimestampedEntry().getSignedEntry().getX509());\n+      logEntryBuilder.setX509Entry(x509EntryChain);\n+\n+    } else if (entryType == Ct.LogEntryType.PRECERT_ENTRY) {\n+      Ct.PrecertChainEntry preCertChain = parsePrecerChainEntry(extraData,\n+        treeLeaf.getTimestampedEntry().getSignedEntry().getPrecert());\n+       logEntryBuilder.setPrecertEntry(preCertChain);\n+\n+    } else {\n+      throw new SerializationException(String.format(\"Unknown entry type: %d\", entryType));\n+    }\n+    Ct.LogEntry logEntry = logEntryBuilder.build();\n+    return new ParsedLogEntry(treeLeaf, logEntry);\n+  }\n+\n+  /**\n+   * Parses a {@link Ct.MerkleTreeLeaf} from binary encoding.\n+   * @param in byte stream of binary encoding.\n+   * @return Built {@link Ct.MerkleTreeLeaf}.\n+   * @throws SerializationException if the data stream is too short.\n+   */\n+  public static Ct.MerkleTreeLeaf parseMerkleTreeLeaf(InputStream in) {\n+    Ct.MerkleTreeLeaf.Builder merkleTreeLeafBuilder = Ct.MerkleTreeLeaf.newBuilder();\n+\n+    int version = (int) readNumber(in, CTConstants.VERSION_LENGTH);\n+    if (version != Ct.Version.V1.getNumber()) {\n+      throw new SerializationException(String.format(\"Unknown version: %d\", version));\n+    }\n+    merkleTreeLeafBuilder.setVersion(Ct.Version.valueOf(version));\n+\n+    int leafType = (int) readNumber(in, 1);\n+    if (leafType != Ct.MerkleLeafType.TIMESTAMPED_ENTRY_VALUE) {\n+      throw new SerializationException(String.format(\"Unknown entry type: %d\", leafType));\n+    }\n+    merkleTreeLeafBuilder.setType(Ct.MerkleLeafType.valueOf(leafType));\n+\n+    merkleTreeLeafBuilder.setTimestampedEntry((parseTimestampedEntry(in)));\n+\n+    return merkleTreeLeafBuilder.build();\n+  }\n+\n+  /**\n+   * Parses a {@link Ct.TimestampedEntry} from binary encoding.\n+   * @param in byte stream of binary encoding.\n+   * @return Built {@link Ct.TimestampedEntry}.\n+   * @throws SerializationException if the data stream is too short.\n+   */\n+  public static Ct.TimestampedEntry parseTimestampedEntry(InputStream in) {\n+    Ct.TimestampedEntry.Builder timestampedEntry = Ct.TimestampedEntry.newBuilder();\n+\n+    long timestamp = readNumber(in, CTConstants.TIMESTAMP_LENGTH);\n+    timestampedEntry.setTimestamp(timestamp);\n+\n+    int entryType = (int) readNumber(in, CTConstants.LOG_ENTRY_TYPE_LENGTH);\n+    timestampedEntry.setEntryType(Ct.LogEntryType.valueOf(entryType));\n+\n+    Ct.SignedEntry.Builder signedEntryBuilder = Ct.SignedEntry.newBuilder();\n+    if (entryType == Ct.LogEntryType.X509_ENTRY_VALUE) {\n+\n+      int length = getFieldLength(in);\n+      ByteString x509 = ByteString.copyFrom(readFixedLength(in, length));\n+      signedEntryBuilder.setX509(x509);\n+\n+    } else if (entryType == Ct.LogEntryType.PRECERT_ENTRY_VALUE) {\n+      Ct.PreCert.Builder preCertBuilder = Ct.PreCert.newBuilder();\n+\n+      byte[] arr = readFixedLength(in, 32);\n+      preCertBuilder.setIssuerKeyHash(ByteString.copyFrom(arr));\n+\n+      // set tbs certificate\n+      arr = readFixedLength(in, 2);\n+      int length = ((arr[0] & 0xFF) << 8) | (arr[1]);\n+\n+      preCertBuilder.setTbsCertificate(ByteString.copyFrom(readFixedLength(in, length)));\n+      preCertBuilder.build();\n+\n+      signedEntryBuilder.setPrecert(preCertBuilder);\n+    } else {\n+      throw new SerializationException(String.format(\"Unknown entry type: %d\", entryType));\n+    }\n+    signedEntryBuilder.build();\n+    timestampedEntry.setSignedEntry(signedEntryBuilder);\n+\n+    return timestampedEntry.build();\n+  }\n+\n+  /**\n+   * Parses X509ChainEntry structure.\n+   * @param in X509ChainEntry structure, byte stream of binary encoding.\n+   * @param x509Cert leaf certificate.\n+   * @throws SerializationException if an I/O error occurs.\n+   * @return {@link Ct.X509ChainEntry} proto object.\n+   */\n+  public static Ct.X509ChainEntry parseX509ChainEntry(InputStream in, ByteString x509Cert) {\n+    Ct.X509ChainEntry.Builder x509EntryChain = Ct.X509ChainEntry.newBuilder();\n+    x509EntryChain.setLeafCertificate(x509Cert);\n+\n+    try {\n+      if (getFieldLength(in) != in.available()) {\n+        throw new SerializationException(\"Extra data corrupted.\");\n+      }\n+      while (in.available() > 0) {\n+        int length = getFieldLength(in);\n+        x509EntryChain.addCertificateChain(ByteString.copyFrom(readFixedLength(in, length)));\n+      }\n+    } catch (IOException e) {\n+      throw new SerializationException(\"Cannot parse xChainEntry. \" + e.getLocalizedMessage());\n+    }\n+\n+    return x509EntryChain.build();\n+  }\n+\n+  /**\n+   * Parses PrecertChainEntry structure.\n+   * @param in PrecertChainEntry structure, byte stream of binary encoding.\n+   * @param preCert Precertificate.\n+   * @return {@link Ct.PrecertChainEntry} proto object.\n+   */\n+  public static Ct.PrecertChainEntry parsePrecerChainEntry(InputStream in, Ct.PreCert preCert)  {\n+    Ct.PrecertChainEntry.Builder preCertChain = Ct.PrecertChainEntry.newBuilder();\n+    preCertChain.setPreCert(preCert);\n+\n+    try {\n+      if (getFieldLength(in) != in.available()) {\n+        throw new SerializationException(\"Extra data corrupted.\");\n+      }\n+      while (in.available() > 0) {\n+        int length = getFieldLength(in);\n+        preCertChain.addPrecertificateChain(ByteString.copyFrom(readFixedLength(in, length)));\n+      }\n+    } catch (IOException e) {\n+      throw new SerializationException(\"Cannot parse PrecertEntryChain.\"\n+        + e.getLocalizedMessage());\n+    }\n+    return preCertChain.build();\n+  }\n+\n+  private static int getFieldLength(InputStream in) {\n+    byte[] arr = readFixedLength(in, 3);\n+    return (arr[2] & 0xFF) | ((arr[1] & 0xFF) << 8) | ((arr[0] & 0xFF) << 16);","path":"java/src/org/certificatetransparency/ctlog/serialization/Deserializer.java","position":167,"original_position":167,"commit_id":"b18cb7113c6584ad4afea30d669c742ddde3f0bd","original_commit_id":"b18cb7113c6584ad4afea30d669c742ddde3f0bd","user":{"login":"eranmes","id":1072163,"avatar_url":"https://avatars.githubusercontent.com/u/1072163?v=2","gravatar_id":"df08a26d26c72e2139dfde6a776701ae","url":"https://api.github.com/users/eranmes","html_url":"https://github.com/eranmes","followers_url":"https://api.github.com/users/eranmes/followers","following_url":"https://api.github.com/users/eranmes/following{/other_user}","gists_url":"https://api.github.com/users/eranmes/gists{/gist_id}","starred_url":"https://api.github.com/users/eranmes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eranmes/subscriptions","organizations_url":"https://api.github.com/users/eranmes/orgs","repos_url":"https://api.github.com/users/eranmes/repos","events_url":"https://api.github.com/users/eranmes/events{/privacy}","received_events_url":"https://api.github.com/users/eranmes/received_events","type":"User","site_admin":false},"body":"Is readNumber not suitable here?","created_at":"2014-08-14T16:04:24Z","updated_at":"2014-08-14T16:04:24Z","html_url":"https://github.com/google/certificate-transparency/pull/80#discussion_r16247354","pull_request_url":"https://api.github.com/repos/google/certificate-transparency/pulls/80","_links":{"self":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/comments/16247354"},"html":{"href":"https://github.com/google/certificate-transparency/pull/80#discussion_r16247354"},"pull_request":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/80"}}},"pull_request":{"url":"https://api.github.com/repos/google/certificate-transparency/pulls/80","id":19784808,"html_url":"https://github.com/google/certificate-transparency/pull/80","diff_url":"https://github.com/google/certificate-transparency/pull/80.diff","patch_url":"https://github.com/google/certificate-transparency/pull/80.patch","issue_url":"https://api.github.com/repos/google/certificate-transparency/issues/80","number":80,"state":"open","locked":false,"title":"Exteded HttpLogClient by get Log entries functionality.","user":{"login":"kovrus","id":7442373,"avatar_url":"https://avatars.githubusercontent.com/u/7442373?v=2","gravatar_id":"667e2b7d34b093f8516bcf8a1f5902ba","url":"https://api.github.com/users/kovrus","html_url":"https://github.com/kovrus","followers_url":"https://api.github.com/users/kovrus/followers","following_url":"https://api.github.com/users/kovrus/following{/other_user}","gists_url":"https://api.github.com/users/kovrus/gists{/gist_id}","starred_url":"https://api.github.com/users/kovrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovrus/subscriptions","organizations_url":"https://api.github.com/users/kovrus/orgs","repos_url":"https://api.github.com/users/kovrus/repos","events_url":"https://api.github.com/users/kovrus/events{/privacy}","received_events_url":"https://api.github.com/users/kovrus/received_events","type":"User","site_admin":false},"body":"","created_at":"2014-08-14T12:44:35Z","updated_at":"2014-08-14T16:04:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d30291d54c5312c0ed973cc56d99a2acad3ba570","assignee":{"login":"eranmes","id":1072163,"avatar_url":"https://avatars.githubusercontent.com/u/1072163?v=2","gravatar_id":"df08a26d26c72e2139dfde6a776701ae","url":"https://api.github.com/users/eranmes","html_url":"https://github.com/eranmes","followers_url":"https://api.github.com/users/eranmes/followers","following_url":"https://api.github.com/users/eranmes/following{/other_user}","gists_url":"https://api.github.com/users/eranmes/gists{/gist_id}","starred_url":"https://api.github.com/users/eranmes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eranmes/subscriptions","organizations_url":"https://api.github.com/users/eranmes/orgs","repos_url":"https://api.github.com/users/eranmes/repos","events_url":"https://api.github.com/users/eranmes/events{/privacy}","received_events_url":"https://api.github.com/users/eranmes/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/google/certificate-transparency/pulls/80/commits","review_comments_url":"https://api.github.com/repos/google/certificate-transparency/pulls/80/comments","review_comment_url":"https://api.github.com/repos/google/certificate-transparency/pulls/comments/{number}","comments_url":"https://api.github.com/repos/google/certificate-transparency/issues/80/comments","statuses_url":"https://api.github.com/repos/google/certificate-transparency/statuses/b18cb7113c6584ad4afea30d669c742ddde3f0bd","head":{"label":"kovrus:httplogclient-ext","ref":"httplogclient-ext","sha":"b18cb7113c6584ad4afea30d669c742ddde3f0bd","user":{"login":"kovrus","id":7442373,"avatar_url":"https://avatars.githubusercontent.com/u/7442373?v=2","gravatar_id":"667e2b7d34b093f8516bcf8a1f5902ba","url":"https://api.github.com/users/kovrus","html_url":"https://github.com/kovrus","followers_url":"https://api.github.com/users/kovrus/followers","following_url":"https://api.github.com/users/kovrus/following{/other_user}","gists_url":"https://api.github.com/users/kovrus/gists{/gist_id}","starred_url":"https://api.github.com/users/kovrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovrus/subscriptions","organizations_url":"https://api.github.com/users/kovrus/orgs","repos_url":"https://api.github.com/users/kovrus/repos","events_url":"https://api.github.com/users/kovrus/events{/privacy}","received_events_url":"https://api.github.com/users/kovrus/received_events","type":"User","site_admin":false},"repo":{"id":20541838,"name":"certificate-transparency","full_name":"kovrus/certificate-transparency","owner":{"login":"kovrus","id":7442373,"avatar_url":"https://avatars.githubusercontent.com/u/7442373?v=2","gravatar_id":"667e2b7d34b093f8516bcf8a1f5902ba","url":"https://api.github.com/users/kovrus","html_url":"https://github.com/kovrus","followers_url":"https://api.github.com/users/kovrus/followers","following_url":"https://api.github.com/users/kovrus/following{/other_user}","gists_url":"https://api.github.com/users/kovrus/gists{/gist_id}","starred_url":"https://api.github.com/users/kovrus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovrus/subscriptions","organizations_url":"https://api.github.com/users/kovrus/orgs","repos_url":"https://api.github.com/users/kovrus/repos","events_url":"https://api.github.com/users/kovrus/events{/privacy}","received_events_url":"https://api.github.com/users/kovrus/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kovrus/certificate-transparency","description":"Auditing for TLS certificates.","fork":true,"url":"https://api.github.com/repos/kovrus/certificate-transparency","forks_url":"https://api.github.com/repos/kovrus/certificate-transparency/forks","keys_url":"https://api.github.com/repos/kovrus/certificate-transparency/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kovrus/certificate-transparency/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kovrus/certificate-transparency/teams","hooks_url":"https://api.github.com/repos/kovrus/certificate-transparency/hooks","issue_events_url":"https://api.github.com/repos/kovrus/certificate-transparency/issues/events{/number}","events_url":"https://api.github.com/repos/kovrus/certificate-transparency/events","assignees_url":"https://api.github.com/repos/kovrus/certificate-transparency/assignees{/user}","branches_url":"https://api.github.com/repos/kovrus/certificate-transparency/branches{/branch}","tags_url":"https://api.github.com/repos/kovrus/certificate-transparency/tags","blobs_url":"https://api.github.com/repos/kovrus/certificate-transparency/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kovrus/certificate-transparency/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kovrus/certificate-transparency/git/refs{/sha}","trees_url":"https://api.github.com/repos/kovrus/certificate-transparency/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kovrus/certificate-transparency/statuses/{sha}","languages_url":"https://api.github.com/repos/kovrus/certificate-transparency/languages","stargazers_url":"https://api.github.com/repos/kovrus/certificate-transparency/stargazers","contributors_url":"https://api.github.com/repos/kovrus/certificate-transparency/contributors","subscribers_url":"https://api.github.com/repos/kovrus/certificate-transparency/subscribers","subscription_url":"https://api.github.com/repos/kovrus/certificate-transparency/subscription","commits_url":"https://api.github.com/repos/kovrus/certificate-transparency/commits{/sha}","git_commits_url":"https://api.github.com/repos/kovrus/certificate-transparency/git/commits{/sha}","comments_url":"https://api.github.com/repos/kovrus/certificate-transparency/comments{/number}","issue_comment_url":"https://api.github.com/repos/kovrus/certificate-transparency/issues/comments/{number}","contents_url":"https://api.github.com/repos/kovrus/certificate-transparency/contents/{+path}","compare_url":"https://api.github.com/repos/kovrus/certificate-transparency/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kovrus/certificate-transparency/merges","archive_url":"https://api.github.com/repos/kovrus/certificate-transparency/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kovrus/certificate-transparency/downloads","issues_url":"https://api.github.com/repos/kovrus/certificate-transparency/issues{/number}","pulls_url":"https://api.github.com/repos/kovrus/certificate-transparency/pulls{/number}","milestones_url":"https://api.github.com/repos/kovrus/certificate-transparency/milestones{/number}","notifications_url":"https://api.github.com/repos/kovrus/certificate-transparency/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kovrus/certificate-transparency/labels{/name}","releases_url":"https://api.github.com/repos/kovrus/certificate-transparency/releases{/id}","created_at":"2014-06-05T21:15:03Z","updated_at":"2014-07-02T15:14:51Z","pushed_at":"2014-08-14T12:42:54Z","git_url":"git://github.com/kovrus/certificate-transparency.git","ssh_url":"git@github.com:kovrus/certificate-transparency.git","clone_url":"https://github.com/kovrus/certificate-transparency.git","svn_url":"https://github.com/kovrus/certificate-transparency","homepage":"http://www.certificate-transparency.org/","size":16949,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"67d7522c285a3d04b1be2273faf7ef729df26a3d","user":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=2","gravatar_id":"24ba30616d2a20673f54c2aee36d159e","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":19989605,"name":"certificate-transparency","full_name":"google/certificate-transparency","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=2","gravatar_id":"24ba30616d2a20673f54c2aee36d159e","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/certificate-transparency","description":"Auditing for TLS certificates.","fork":false,"url":"https://api.github.com/repos/google/certificate-transparency","forks_url":"https://api.github.com/repos/google/certificate-transparency/forks","keys_url":"https://api.github.com/repos/google/certificate-transparency/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/certificate-transparency/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/certificate-transparency/teams","hooks_url":"https://api.github.com/repos/google/certificate-transparency/hooks","issue_events_url":"https://api.github.com/repos/google/certificate-transparency/issues/events{/number}","events_url":"https://api.github.com/repos/google/certificate-transparency/events","assignees_url":"https://api.github.com/repos/google/certificate-transparency/assignees{/user}","branches_url":"https://api.github.com/repos/google/certificate-transparency/branches{/branch}","tags_url":"https://api.github.com/repos/google/certificate-transparency/tags","blobs_url":"https://api.github.com/repos/google/certificate-transparency/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/certificate-transparency/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/certificate-transparency/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/certificate-transparency/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/certificate-transparency/statuses/{sha}","languages_url":"https://api.github.com/repos/google/certificate-transparency/languages","stargazers_url":"https://api.github.com/repos/google/certificate-transparency/stargazers","contributors_url":"https://api.github.com/repos/google/certificate-transparency/contributors","subscribers_url":"https://api.github.com/repos/google/certificate-transparency/subscribers","subscription_url":"https://api.github.com/repos/google/certificate-transparency/subscription","commits_url":"https://api.github.com/repos/google/certificate-transparency/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/certificate-transparency/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/certificate-transparency/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/certificate-transparency/issues/comments/{number}","contents_url":"https://api.github.com/repos/google/certificate-transparency/contents/{+path}","compare_url":"https://api.github.com/repos/google/certificate-transparency/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/certificate-transparency/merges","archive_url":"https://api.github.com/repos/google/certificate-transparency/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/certificate-transparency/downloads","issues_url":"https://api.github.com/repos/google/certificate-transparency/issues{/number}","pulls_url":"https://api.github.com/repos/google/certificate-transparency/pulls{/number}","milestones_url":"https://api.github.com/repos/google/certificate-transparency/milestones{/number}","notifications_url":"https://api.github.com/repos/google/certificate-transparency/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/certificate-transparency/labels{/name}","releases_url":"https://api.github.com/repos/google/certificate-transparency/releases{/id}","created_at":"2014-05-20T17:03:47Z","updated_at":"2014-08-08T16:13:47Z","pushed_at":"2014-08-13T11:16:43Z","git_url":"git://github.com/google/certificate-transparency.git","ssh_url":"git@github.com:google/certificate-transparency.git","clone_url":"https://github.com/google/certificate-transparency.git","svn_url":"https://github.com/google/certificate-transparency","homepage":"http://www.certificate-transparency.org/","size":19170,"stargazers_count":40,"watchers_count":40,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":14,"mirror_url":null,"open_issues_count":4,"forks":14,"open_issues":4,"watchers":40,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/80"},"html":{"href":"https://github.com/google/certificate-transparency/pull/80"},"issue":{"href":"https://api.github.com/repos/google/certificate-transparency/issues/80"},"comments":{"href":"https://api.github.com/repos/google/certificate-transparency/issues/80/comments"},"review_comments":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/80/comments"},"review_comment":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/google/certificate-transparency/pulls/80/commits"},"statuses":{"href":"https://api.github.com/repos/google/certificate-transparency/statuses/b18cb7113c6584ad4afea30d669c742ddde3f0bd"}}}}