浏览代码

Add other side of half-open-connection logic (still disabled

svn:r206
Nick Mathewson 22 年之前
父节点
当前提交
3a0cf37641
共有 2 个文件被更改,包括 25 次插入2 次删除
  1. 25 0
      src/or/connection_ap.c
  2. 0 2
      src/or/connection_exit.c

+ 25 - 0
src/or/connection_ap.c

@@ -11,9 +11,34 @@ int connection_ap_process_inbuf(connection_t *conn) {
   assert(conn && conn->type == CONN_TYPE_AP);
 
   if(conn->inbuf_reached_eof) {
+#ifdef HALF_OPEN
+    /* eof reached; we're done reading, but we might want to write more. */ 
+    conn->done_receiving = 1;
+    shutdown(conn->s, 0); /* XXX check return, refactor NM */
+    if (conn->done_sending)
+      conn->marked_for_close = 1;
+
+    /* XXX Factor out common logic here and in circuit_about_to_close NM */
+    circ = circuit_get_by_conn(conn);
+    if (!circ)
+      return -1;
+    
+    memset(&cell, 0, sizeof(cell_t));
+    cell.command = CELL_DATA;
+    cell.length = TOPIC_HEADER_SIZE;
+    *(uint16_t *)(cell.payload+2) = htons(conn->topic_id);
+    *cell.payload = TOPIC_COMMAND_END;
+    cell.aci = circ->n_aci;
+    if (circuit_deliver_data_cell_from_edge(&cell, circ, EDGE_AP) < 0) {
+      log(LOG_DEBUG,"connection_ap_process_inbuf: circuit_deliver_data_cell_from_edge failed.  Closing");
+      circuit_close(circ);
+    }
+    return 0;
+#else 
     /* eof reached, kill it. */
     log(LOG_DEBUG,"connection_ap_process_inbuf(): conn reached eof. Closing.");
     return -1;
+#endif
   }
 
 //  log(LOG_DEBUG,"connection_ap_process_inbuf(): state %d.",conn->state);

+ 0 - 2
src/or/connection_exit.c

@@ -12,8 +12,6 @@ int connection_exit_process_inbuf(connection_t *conn) {
 
   if(conn->inbuf_reached_eof) {
 #ifdef HALF_OPEN
-    /* XXX!!! If this is right, duplicate it in connection_ap.c */
-
     /* eof reached; we're done reading, but we might want to write more. */ 
     conn->done_receiving = 1;
     shutdown(conn->s, 0); /* XXX check return, refactor NM */