* added the 'weight' parameter to the servers, limited to 1..256.
  It is factored between all the servers so that the servers map
  will be smaller and easier to construct.
diff --git a/haproxy.c b/haproxy.c
index cb1cda3..81e7934 100644
--- a/haproxy.c
+++ b/haproxy.c
@@ -513,6 +513,8 @@
     int curfd;				/* file desc used for current test, or -1 if not in test */
     int cur_sess;			/* number of currently active sessions (including syn_sent) */
     unsigned int cum_sess;		/* cumulated number of sessions really sent to this server */
+    unsigned char uweight, eweight;	/* user-specified weight-1, and effective weight-1 */
+    unsigned short wsquare;		/* eweight*eweight, to speed up map computation */
     struct proxy *proxy;		/* the proxy this server belongs to */
 };
 
@@ -7090,6 +7092,17 @@
 		newsrv->state |= SRV_BACKUP;
 		cur_arg ++;
 	    }
+	    else if (!strcmp(args[cur_arg], "weight")) {
+		int w;
+		w = atol(args[cur_arg + 1]);
+		if (w < 1 || w > 256) {
+		    Alert("parsing [%s:%d] : weight of server %s is not within 1 and 256 (%d).\n",
+			  file, linenum, newsrv->id, w);
+		    return -1;
+		}
+		newsrv->uweight = w - 1;
+		cur_arg += 2;
+	    }
 	    else if (!strcmp(args[cur_arg], "check")) {
 		global.maxsock++;
 		do_check = 1;
@@ -7106,7 +7119,7 @@
 		cur_arg += 2;
 	    }
 	    else {
-		Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'check', 'inter', 'rise', 'fall', 'port' and 'source'.\n",
+		Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'check', 'inter', 'rise', 'fall', 'port', 'source', and 'weight'.\n",
 		      file, linenum, newsrv->id);
 		return -1;
 	    }
@@ -7888,9 +7901,26 @@
 		cfgerr++;
 	    }
 	    else {
-		while (newsrv != NULL) {
-		    /* nothing to check for now */
-		    newsrv = newsrv->next;
+		struct server *srv;
+		int pgcd;
+
+		if (newsrv) {
+		    /* We will factor the weights to reduce the table,
+		     * using Euclide's largest common divisor algorithm
+		     */
+		    pgcd = newsrv->uweight + 1;
+		    for (srv = newsrv->next; srv && pgcd > 1; srv = srv->next) {
+			int t, w;
+
+			w = srv->uweight + 1;
+			while (w) {
+			    t = pgcd % w;
+			    pgcd = w;
+			    w = t;
+			}
+		    }
+		    for (srv = newsrv; srv; srv = srv->next)
+			srv->eweight = ((srv->uweight + 1) / pgcd) - 1;
 		}
 	    }
 	}