[BUG] shutw must imply close during a connect

The sessions which were remaining stuck were being connecting to the
server while they received a shutw which caused them to partially
stop. A shutw() during a connect() must imply a close().
diff --git a/src/stream_sock.c b/src/stream_sock.c
index f7b8d9d..584a1cd 100644
--- a/src/stream_sock.c
+++ b/src/stream_sock.c
@@ -113,6 +113,10 @@
 			b->r += ret;
 			b->l += ret;
 			cur_read += ret;
+
+			if (fdtab[fd].state == FD_STCONN)
+				fdtab[fd].state = FD_STREADY;
+
 			b->flags |= BF_READ_PARTIAL;
 			b->flags &= ~BF_EMPTY;
 
@@ -371,6 +375,9 @@
 			b->l -= ret;
 			b->w += ret;
 
+			if (fdtab[fd].state == FD_STCONN)
+				fdtab[fd].state = FD_STREADY;
+
 			b->flags |= BF_WRITE_PARTIAL;
 
 			if (b->l < b->rlim - b->data)
@@ -478,20 +485,22 @@
  */
 void stream_sock_shutw(struct stream_interface *si)
 {
-	if (si->state != SI_ST_EST && si->state != SI_ST_CON) {
-		if (likely(si->state == SI_ST_INI))
-			si->state = SI_ST_CLO;
+	switch (si->state) {
+	case SI_ST_INI:
+		si->state = SI_ST_CLO;
 		return;
-	}
-
-	if (si->ib->flags & BF_SHUTR) {
+	case SI_ST_EST:
+		if (!(si->ib->flags & BF_SHUTR)) {
+			EV_FD_CLR(si->fd, DIR_WR);
+			shutdown(si->fd, SHUT_WR);
+			return;
+		}
+		/* fall through */
+	case SI_ST_CON:
 		fd_delete(si->fd);
 		si->state = SI_ST_DIS;
 		return;
 	}
-	EV_FD_CLR(si->fd, DIR_WR);
-	shutdown(si->fd, SHUT_WR);
-	return;
 }
 
 /*