h2_response *h2_response_die(int stream_id, apr_status_t type, const struct h2_request *req, apr_pool_t *pool) { apr_table_t *headers = apr_table_make(pool, 5); char *date = NULL; date = apr_palloc(pool, APR_RFC822_DATE_LEN); ap_recent_rfc822_date(date, req->request_time); apr_table_setn(headers, "Date", date); apr_table_setn(headers, "Server", ap_get_server_banner()); return h2_response_create_int(stream_id, 0, 500, headers, pool); }
apr_status_t ma_advertise_server(server_rec *server, int type) { char buf[MA_BSIZE]; char dat[APR_RFC822_DATE_LEN]; char add[40]; unsigned char msig[APR_MD5_DIGESTSIZE]; unsigned char ssig[APR_MD5_DIGESTSIZE * 2 + 1]; const char *asl; char *p = buf; int i, c = 0; apr_size_t l = MA_BSIZE - 8; apr_size_t n = 0; apr_md5_ctx_t md; mod_advertise_config *mconf = ap_get_module_config(server->module_config, &advertise_module); ma_sequence++; if (ma_sequence < 1) ma_sequence = 1; sprintf(buf, "%" APR_INT64_T_FMT, ma_sequence); ap_recent_rfc822_date(dat, apr_time_now()); asl = ap_get_status_line(ma_advertise_stat); /* Create MD5 digest * salt + date + sequence + srvid */ apr_md5_init(&md); apr_md5_update(&md, magd->ssalt, APR_MD5_DIGESTSIZE); apr_md5_update(&md, dat, strlen(dat)); apr_md5_update(&md, buf, strlen(buf)); apr_md5_update(&md, magd->srvid + 1, strlen(magd->srvid) - 1); apr_md5_final(msig, &md); /* Convert MD5 digest to hex string */ for (i = 0; i < APR_MD5_DIGESTSIZE; i++) { ssig[c++] = hex[msig[i] >> 4]; ssig[c++] = hex[msig[i] & 0x0F]; } ssig[c] = '\0'; n = apr_snprintf(p, l, MA_ADVERTISE_SERVER_FMT, asl, dat, ma_sequence, ssig, magd->srvid + 1); if (type == MA_ADVERTISE_SERVER) { char *ma_advertise_srvs = mconf->ma_advertise_srvs; if (strchr(ma_advertise_srvs, ':') != NULL) { apr_snprintf(add, 40, "[%s]", mconf->ma_advertise_srvs); ma_advertise_srvs = add; } l -= n; n += apr_snprintf(p + n, l, "X-Manager-Address: %s:%u" CRLF "X-Manager-Url: %s" CRLF "X-Manager-Protocol: %s" CRLF "X-Manager-Host: %s" CRLF, ma_advertise_srvs, mconf->ma_advertise_srvp, mconf->ma_advertise_srvh, mconf->ma_advertise_srvm, server->server_hostname); } strcat(p, CRLF); n += 2; return apr_socket_sendto(ma_mgroup_socket, ma_mgroup_sa, 0, buf, &n); }