int swString_append_int(swString *str, int value) { char buf[16]; int s_len = swoole_itoa(buf, value); int new_size = str->length + s_len; if (new_size > str->size) { if (swString_extend(str, swoole_size_align(new_size * 2, sysconf(_SC_PAGESIZE))) < 0) { return SW_ERR; } } memcpy(str->str + str->length, buf, s_len); str->length += s_len; return SW_OK; }
static int http2_build_header(http_context *ctx, uchar *buffer, int body_length TSRMLS_DC) { assert(ctx->send_header == 0); char buf[SW_HTTP_HEADER_MAX_SIZE]; char *date_str = NULL; char intbuf[2][16]; int ret; /** * http header */ zval *zheader = ctx->response.zheader; int index = 0; nghttp2_nv nv[128]; /** * http status code */ if (ctx->response.status == 0) { ctx->response.status = 200; } ret = swoole_itoa(intbuf[0], ctx->response.status); http2_add_header(&nv[index++], ZEND_STRL(":status"), intbuf[0], ret); if (zheader) { int flag = 0x0; char *key_server = "server"; char *key_content_length = "content-length"; char *key_content_type = "content-type"; char *key_date = "date"; HashTable *ht = Z_ARRVAL_P(zheader); zval *value = NULL; char *key = NULL; uint32_t keylen = 0; int type; SW_HASHTABLE_FOREACH_START2(ht, key, keylen, type, value) { if (!key) { break; } if (strcmp(key, key_server) == 0) { flag |= HTTP_RESPONSE_SERVER; } else if (strcmp(key, key_content_length) == 0) { flag |= HTTP_RESPONSE_CONTENT_LENGTH; } else if (strcmp(key, key_date) == 0) { flag |= HTTP_RESPONSE_DATE; } else if (strcmp(key, key_content_type) == 0) { flag |= HTTP_RESPONSE_CONTENT_TYPE; } http2_add_header(&nv[index++], key, keylen - 1, Z_STRVAL_P(value), Z_STRLEN_P(value)); } SW_HASHTABLE_FOREACH_END(); if (!(flag & HTTP_RESPONSE_SERVER)) { http2_add_header(&nv[index++], ZEND_STRL("server"), ZEND_STRL(SW_HTTP_SERVER_SOFTWARE)); } if (ctx->request.method == PHP_HTTP_OPTIONS) { http2_add_header(&nv[index++], ZEND_STRL("allow"), ZEND_STRL("GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS")); } else { if (!(flag & HTTP_RESPONSE_CONTENT_LENGTH) && body_length >= 0) { #ifdef SW_HAVE_ZLIB if (ctx->gzip_enable) { body_length = swoole_zlib_buffer->length; } #endif ret = swoole_itoa(intbuf[1], body_length); http2_add_header(&nv[index++], ZEND_STRL("content-length"), intbuf[1], ret); } } if (!(flag & HTTP_RESPONSE_DATE)) { date_str = sw_php_format_date(ZEND_STRL(SW_HTTP_DATE_FORMAT), SwooleGS->now, 0 TSRMLS_CC); http2_add_header(&nv[index++], ZEND_STRL("date"), date_str, strlen(date_str)); } if (!(flag & HTTP_RESPONSE_CONTENT_TYPE)) { http2_add_header(&nv[index++], ZEND_STRL("content-type"), ZEND_STRL("text/html")); } } else {