add io.LimitReader.
use it to limit data read from http.Request Body

R=r
DELTA=32  (8 added, 6 deleted, 18 changed)
OCL=33899
CL=33916
diff --git a/src/pkg/io/io.go b/src/pkg/io/io.go
index b38c0ef..7e9d0de 100644
--- a/src/pkg/io/io.go
+++ b/src/pkg/io/io.go
@@ -214,29 +214,25 @@
 	return written, err
 }
 
-// A ByteReader satisfies Reads by consuming data from a slice of bytes.
-// Clients can call NewByteReader to create one or wrap pointers
-// to their own slices: r := ByteReader{&data}.
-type ByteReader struct {
-	Data *[]byte
+// LimitReader returns a Reader that reads from r
+// but stops with os.EOF after n bytes.
+func LimitReader(r Reader, n int64) Reader {
+	return &limitedReader{r, n};
 }
 
-func (r ByteReader) Read(p []byte) (int, os.Error) {
-	n := len(p);
-	b := *r.Data;
-	if len(b) == 0 {
+type limitedReader struct {
+	r Reader;
+	n int64;
+}
+
+func (l *limitedReader) Read(p []byte) (n int, err os.Error) {
+	if l.n <= 0 {
 		return 0, os.EOF;
 	}
-	if n > len(b) {
-		n = len(b);
+	if int64(len(p)) > l.n {
+		p = p[0:l.n];
 	}
-	bytes.Copy(p, b[0:n]);
-	*r.Data = b[n:len(b)];
-	return n, nil;
+	n, err = l.r.Read(p);
+	l.n -= int64(n);
+	return;
 }
-
-// NewByteReader returns a new ByteReader reading from data.
-func NewByteReader(data []byte) ByteReader {
-	return ByteReader{ &data };
-}
-