Chunk Reader/Writer interface
diff --git a/chunk/server.go b/chunk/server.go
index c35d761..315ec00 100644
--- a/chunk/server.go
+++ b/chunk/server.go
@@ -1,6 +1,8 @@
 package chunk
 
+import "bytes"
 import "context"
+import "io"
 import "sync"
 
 import "pcloud/api"
@@ -15,7 +17,7 @@
 
 func (s *ChunkServer) ListChunks(
 	ctx context.Context,
-	request *api.ListChunksRequest) (*api.ListChunksResponse, error) {
+	req *api.ListChunksRequest) (*api.ListChunksResponse, error) {
 	resp := api.ListChunksResponse{}
 	s.chunks.Range(func(k, v interface{}) bool {
 		resp.ChunkId = append(resp.ChunkId, k.(string))
@@ -26,16 +28,34 @@
 
 func (s *ChunkServer) ReadChunk(
 	ctx context.Context,
-	request *api.ReadChunkRequest) (*api.ReadChunkResponse, error) {
-	if data, ok := s.chunks.Load(request.ChunkId); ok {
-		return &api.ReadChunkResponse{Data: data.([]byte)}, nil
+	req *api.ReadChunkRequest) (resp *api.ReadChunkResponse, err error) {
+	if value, ok := s.chunks.Load(req.ChunkId); ok {
+		chunk := value.(Chunk)
+		src := chunk.ReadSeeker()
+		if req.Offset != 0 {
+			_, err = src.Seek(int64(req.Offset), io.SeekStart)
+			if err != nil {
+				return
+			}
+		}
+		var dst bytes.Buffer
+		if req.NumBytes != 0 {
+			_, err = io.CopyN(&dst, src, int64(req.NumBytes))
+		} else {
+			_, err = io.Copy(&dst, src)
+		}
+		if err == nil {
+			resp = &api.ReadChunkResponse{Data: dst.Bytes()}
+		}
 	}
-	return nil, nil
+	return
 }
 
 func (s *ChunkServer) StoreChunk(
 	ctx context.Context,
-	request *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
-	s.chunks.Store(request.ChunkId, request.Data)
+	req *api.StoreChunkRequest) (*api.StoreChunkResponse, error) {
+	data := req.Data
+	chunk := NewInMemoryChunk(&data)
+	s.chunks.Store(req.ChunkId, chunk)
 	return &api.StoreChunkResponse{}, nil
 }