Skip to content

Commit

Permalink
radosgw/swift: clean up flush / newline behavior.
Browse files Browse the repository at this point in the history
The current code emits a newline after swift errors, but fails
to account for it when it calculates 'content-length'.  This results in
some clients (go github.com/ncw/swift) producing complaints about the
unsolicited newline such as this,
	Unsolicited response received on idle HTTP channel starting with "\n"; err=<nil>

This logic eliminates the newline on flush.  This makes the content length
calculation correct and eliminates the stray newline.

There was already existing separator logic in the rgw plain formatter
that can emit a newline at the correct point.  It had been checking
"len" to decide if previous data had been emitted, but that's reset to 0
by flush().  So, this logic adds a new per-instance variable to separately
track state that it emitted a previous item (and should emit a newline).

Fixes: http://tracker.ceph.com/issues/18473
Signed-off-by: Marcus Watts <mwatts@redhat.com>
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
(cherry picked from commit 5f229d6)
  • Loading branch information
mdw-at-linuxbox authored and smithfarm committed Jun 19, 2017
1 parent 358081d commit d1ec595
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
11 changes: 7 additions & 4 deletions src/rgw/rgw_formats.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ RGWFormatter_Plain::RGWFormatter_Plain(const bool ukv)
: buf(NULL),
len(0),
max_len(0),
wrote_something(false),
min_stack_level(0),
use_kv(ukv)
{
Expand All @@ -44,7 +45,7 @@ void RGWFormatter_Plain::flush(ostream& os)
return;

if (len) {
os << buf << "\n";
os << buf;
os.flush();
}

Expand Down Expand Up @@ -159,13 +160,14 @@ void RGWFormatter_Plain::dump_format_va(const char *name, const char *ns, bool q
vsnprintf(buf, LARGE_SIZE, fmt, ap);

const char *eol;
if (len) {
if (wrote_something) {
if (use_kv && entry.is_array && entry.size > 1)
eol = ", ";
else
eol = "\n";
} else
eol = "";
wrote_something = true;

if (use_kv && !entry.is_array)
write_data("%s%s: %s", eol, name, buf);
Expand Down Expand Up @@ -271,10 +273,11 @@ void RGWFormatter_Plain::dump_value_int(const char *name, const char *fmt, ...)
va_end(ap);

const char *eol;
if (len)
if (wrote_something) {
eol = "\n";
else
} else
eol = "";
wrote_something = true;

if (use_kv && !entry.is_array)
write_data("%s%s: %s", eol, name, buf);
Expand Down
1 change: 1 addition & 0 deletions src/rgw/rgw_formats.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class RGWFormatter_Plain : public Formatter {
std::list<struct plain_stack_entry> stack;
size_t min_stack_level;
bool use_kv;
bool wrote_something;
};


Expand Down

0 comments on commit d1ec595

Please sign in to comment.