code: func (c *rawConnection) Request(folder string, name string, offset int64, size int, hash []byte, weakHash uint32, fromTemporary bool) ([]byte, error) {
  	c.nextIDMut.Lock()
  	id := c.nextID
  	c.nextID++
  	c.nextIDMut.Unlock()
  
  	c.awaitingMut.Lock()
  	if _, ok := c.awaiting[id]; ok {
  		panic("id taken")
  	}
  	rc := make(chan asyncResult, 1)
  	c.awaiting[id] = rc
  	c.awaitingMut.Unlock()
  
  	ok := c.send(&Request{
  		ID:            id,
  		Folder:        folder,
  		Name:          name,
  		Offset:        offset,
  		Size:          int32(size),
  		Hash:          hash,
  		WeakHash:      weakHash,
  		FromTemporary: fromTemporary,
  	}, nil)
  	if !ok {
  		return nil, ErrClosed
  	}
  
  	res, ok := <-rc
  	if !ok {
  		return nil, ErrClosed
  	}
  	return res.val, res.err
  }
docs: // Request returns the bytes for the specified block after fetching them from the connected peer.