Commit be67e269 authored by Russ Cox's avatar Russ Cox

archive/zip: replace Writer.Comment field with SetComment method

A method is more in keeping with the rest of the Writer API and
incidentally allows the comment error to be reported earlier.

Fixes #22737.

Change-Id: I1eee2103a0720c76d0c394ccd6541e6219996dc0
Reviewed-on: https://go-review.googlesource.com/79415
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarJoe Tsai <thebrokentoaster@gmail.com>
parent 4f6d8a59
...@@ -26,13 +26,11 @@ type Writer struct { ...@@ -26,13 +26,11 @@ type Writer struct {
last *fileWriter last *fileWriter
closed bool closed bool
compressors map[uint16]Compressor compressors map[uint16]Compressor
comment string
// testHookCloseSizeOffset if non-nil is called with the size // testHookCloseSizeOffset if non-nil is called with the size
// of offset of the central directory at Close. // of offset of the central directory at Close.
testHookCloseSizeOffset func(size, offset uint64) testHookCloseSizeOffset func(size, offset uint64)
// Comment is the central directory comment and must be set before Close is called.
Comment string
} }
type header struct { type header struct {
...@@ -62,13 +60,19 @@ func (w *Writer) Flush() error { ...@@ -62,13 +60,19 @@ func (w *Writer) Flush() error {
return w.cw.w.(*bufio.Writer).Flush() return w.cw.w.(*bufio.Writer).Flush()
} }
// Close finishes writing the zip file by writing the central directory. // SetComment sets the end-of-central-directory comment field.
// It does not (and cannot) close the underlying writer. // It can only be called before Close.
func (w *Writer) Close() error { func (w *Writer) SetComment(comment string) error {
if len(w.Comment) > uint16max { if len(comment) > uint16max {
return errors.New("zip: Writer.Comment too long") return errors.New("zip: Writer.Comment too long")
} }
w.comment = comment
return nil
}
// Close finishes writing the zip file by writing the central directory.
// It does not (and cannot) close the underlying writer.
func (w *Writer) Close() error {
if w.last != nil && !w.last.closed { if w.last != nil && !w.last.closed {
if err := w.last.close(); err != nil { if err := w.last.close(); err != nil {
return err return err
...@@ -189,11 +193,11 @@ func (w *Writer) Close() error { ...@@ -189,11 +193,11 @@ func (w *Writer) Close() error {
b.uint16(uint16(records)) // number of entries total b.uint16(uint16(records)) // number of entries total
b.uint32(uint32(size)) // size of directory b.uint32(uint32(size)) // size of directory
b.uint32(uint32(offset)) // start of directory b.uint32(uint32(offset)) // start of directory
b.uint16(uint16(len(w.Comment))) // byte size of EOCD comment b.uint16(uint16(len(w.comment))) // byte size of EOCD comment
if _, err := w.cw.Write(buf[:]); err != nil { if _, err := w.cw.Write(buf[:]); err != nil {
return err return err
} }
if _, err := io.WriteString(w.cw, w.Comment); err != nil { if _, err := io.WriteString(w.cw, w.comment); err != nil {
return err return err
} }
......
...@@ -106,7 +106,16 @@ func TestWriterComment(t *testing.T) { ...@@ -106,7 +106,16 @@ func TestWriterComment(t *testing.T) {
// write a zip file // write a zip file
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
w := NewWriter(buf) w := NewWriter(buf)
w.Comment = test.comment if err := w.SetComment(test.comment); err != nil {
if test.ok {
t.Fatalf("SetComment: unexpected error %v", err)
}
continue
} else {
if !test.ok {
t.Fatalf("SetComment: unexpected success, want error")
}
}
if err := w.Close(); test.ok == (err != nil) { if err := w.Close(); test.ok == (err != nil) {
t.Fatal(err) t.Fatal(err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment