};
int
-lws_add_http_header_status(struct lws *wsi, unsigned int code,
+lws_add_http_header_status(struct lws *wsi, unsigned int _code,
unsigned char **p, unsigned char *end)
{
- const struct lws_protocol_vhost_options *headers;
- unsigned char code_and_desc[60];
- const char *description = "", *p1;
- int n;
STORE_IN_ROM static const char * const hver[] = {
"HTTP/1.0", "HTTP/1.1", "HTTP/2"
};
+ const struct lws_protocol_vhost_options *headers;
+ unsigned int code = _code & LWSAHH_CODE_MASK;
+ const char *description = "", *p1;
+ unsigned char code_and_desc[60];
+ int n;
#ifdef LWS_WITH_ACCESS_LOG
wsi->access_log.response = code;
else
p1 = hver[0];
- n = sprintf((char *)code_and_desc, "%s %u %s",
- p1, code, description);
+ n = sprintf((char *)code_and_desc, "%s %u %s", p1, code, description);
- if (lws_add_http_header_by_name(wsi, NULL, code_and_desc,
- n, p, end))
+ if (lws_add_http_header_by_name(wsi, NULL, code_and_desc, n, p, end))
return 1;
headers = wsi->vhost->headers;
headers = headers->next;
}
- if (wsi->context->server_string)
- if (lws_add_http_header_by_token(wsi,
- WSI_TOKEN_HTTP_SERVER,
- (unsigned char *)
- wsi->context->server_string,
- wsi->context->server_string_len,
- p, end))
+ if (wsi->context->server_string &&
+ !(_code & LWSAHH_FLAG_NO_SERVER_NAME))
+ if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_SERVER,
+ (unsigned char *)wsi->context->server_string,
+ wsi->context->server_string_len, p, end))
return 1;
if (wsi->vhost->options & LWS_SERVER_OPTION_STS)
HTTP_STATUS_MOVED_PERMANENTLY = 301,
HTTP_STATUS_FOUND = 302,
HTTP_STATUS_SEE_OTHER = 303,
+ HTTP_STATUS_NOT_MODIFIED = 304,
HTTP_STATUS_BAD_REQUEST = 400,
HTTP_STATUS_UNAUTHORIZED,
* and fail with nonzero return.
*/
///@{
+
+#define LWSAHH_CODE_MASK ((1 << 16) - 1)
+#define LWSAHH_FLAG_NO_SERVER_NAME (1 << 30)
+
/**
* lws_add_http_header_status() - add the HTTP response status code
*
* \param p: pointer to current position in buffer pointer
* \param end: pointer to end of buffer
*
- * Adds the initial response code, so should be called first
+ * Adds the initial response code, so should be called first.
+ *
+ * Code may additionally take OR'd flags:
+ *
+ * LWSAHH_FLAG_NO_SERVER_NAME: don't apply server name header this time
*/
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
lws_add_http_header_status(struct lws *wsi,
uri, origin);
/* we don't need to send the payload */
- if (lws_add_http_header_status(wsi, 304, &p, end))
+ if (lws_add_http_header_status(wsi,
+ HTTP_STATUS_NOT_MODIFIED, &p, end))
return -1;
if (lws_add_http_header_by_token(wsi,
p = buffer + LWS_PRE;
end = p + sizeof(buffer) - LWS_PRE;
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
return 1;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_CONNECTION,
(unsigned char *)"close", 5, &p, end))
start = p;
end = p + sizeof(buffer) - LWS_PRE;
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
return -1;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,
(unsigned char *)"text/plain", 10,
start = p;
end = p + sizeof(buffer) - LWS_PRE;
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
return -1;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,
(unsigned char *)"text/plain", 10, &p, end))
start = p;
end = p + n - LWS_PRE - 1;
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
goto bail;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,
* depending on what connection it happens to be working
* on
*/
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
return 1;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_SERVER,
(unsigned char *)"libwebsockets",
start = p;
end = p + sizeof(buffer) - LWS_PRE;
- if (lws_add_http_header_status(wsi, 200, &p, end))
+ if (lws_add_http_header_status(wsi, HTTP_STATUS_OK, &p, end))
return 1;
if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE,
lwsl_err("LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP\n");
p = buffer + LWS_PRE;
end = p + sizeof(buffer) - LWS_PRE;
- if (lws_add_http_header_status(lws_get_parent(wsi), 200, &p, end))
+ if (lws_add_http_header_status(lws_get_parent(wsi), HTTP_STATUS_OK, &p, end))
return 1;
if (lws_add_http_header_by_token(lws_get_parent(wsi),
WSI_TOKEN_HTTP_SERVER,