{
if (!sent_header) {
if (!has_content_length) {
+
header_done = false; /* let's go back to writing the header */
- if (0 && data.length() == 0) {
+ /*
+ * Status 204 should not include a content-length header
+ * RFC7230 says so
+ */
+ if (status_num == 204) {
+ has_content_length = true;
+ } else if (0 && data.length() == 0) {
has_content_length = true;
print("Transfer-Enconding: %s\r\n", "chunked");
data.append("0\r\n\r\n", sizeof("0\r\n\r\n")-1);
{
env.init(cct);
struct mg_request_info *info = mg_get_request_info(conn);
+ status_num = 0;
+
if (!info)
return;
*dest = c;
}
*dest = '\0';
-
+
env.set(buf, header->value);
}
bl.append(header_data);
header_data = bl;
- int status_num = atoi(status);
+ status_num = atoi(status);
mg_set_http_status(conn, status_num);
return 0;
void RGWFCGX::init_env(CephContext *cct)
{
env.init(cct, (char **)fcgx->envp);
+ status_num = 0;
}
int RGWFCGX::send_status(const char *status, const char *status_name)
{
+ status_num = atoi(status);
return print("Status: %s %s\r\n", status, status_name);
}
int RGWFCGX::send_content_length(uint64_t len)
{
+ /*
+ * Status 204 should not include a content-length header
+ * RFC7230 says so
+ */
+ if (status_num == 204)
+ return 0;
+
char buf[21];
snprintf(buf, sizeof(buf), "%" PRIu64, len);
return print("Content-Length: %s\r\n", buf);
{
return print("\r\n");
}
-
class RGWFCGX : public RGWClientIO
{
FCGX_Request *fcgx;
+
+ int status_num;
+
protected:
void init_env(CephContext *cct);
int write_data(const char *buf, int len);