ajp_utils.c revision e6061cf1962bb4bcce89c2bdce375398d614be6a
03831d35f7499c87d51205817c93e9a8d42c4baestevel/* Licensed to the Apache Software Foundation (ASF) under one or more
03831d35f7499c87d51205817c93e9a8d42c4baestevel * contributor license agreements. See the NOTICE file distributed with
03831d35f7499c87d51205817c93e9a8d42c4baestevel * this work for additional information regarding copyright ownership.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * The ASF licenses this file to You under the Apache License, Version 2.0
03831d35f7499c87d51205817c93e9a8d42c4baestevel * (the "License"); you may not use this file except in compliance with
03831d35f7499c87d51205817c93e9a8d42c4baestevel * the License. You may obtain a copy of the License at
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * http://www.apache.org/licenses/LICENSE-2.0
03831d35f7499c87d51205817c93e9a8d42c4baestevel *
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Unless required by applicable law or agreed to in writing, software
03831d35f7499c87d51205817c93e9a8d42c4baestevel * distributed under the License is distributed on an "AS IS" BASIS,
03831d35f7499c87d51205817c93e9a8d42c4baestevel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
03831d35f7499c87d51205817c93e9a8d42c4baestevel * See the License for the specific language governing permissions and
03831d35f7499c87d51205817c93e9a8d42c4baestevel * limitations under the License.
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#include "ajp.h"
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelAPLOG_USE_MODULE(proxy_ajp);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/*
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Handle the CPING/CPONG
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelapr_status_t ajp_handle_cping_cpong(apr_socket_t *sock,
03831d35f7499c87d51205817c93e9a8d42c4baestevel request_rec *r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel apr_interval_time_t timeout)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel ajp_msg_t *msg;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apr_status_t rc, rv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apr_interval_time_t org;
03831d35f7499c87d51205817c93e9a8d42c4baestevel apr_byte_t result;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_TRACE8, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "Into ajp_handle_cping_cpong");
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = ajp_msg_create(r->pool, AJP_PING_PONG_SZ, &msg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: ajp_msg_create failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = ajp_msg_serialize_cping(msg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: ajp_marshal_into_msgb failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = ajp_ilink_send(sock, msg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel ajp_msg_log(r, msg, "ajp_handle_cping_cpong: ajp_ilink_send packet dump");
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: ajp_ilink_send failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = apr_socket_timeout_get(sock, &org);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: apr_socket_timeout_get failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Set CPING/CPONG response timeout */
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = apr_socket_timeout_set(sock, timeout);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: apr_socket_timeout_set failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel ajp_msg_reuse(msg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Read CPONG reply */
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = ajp_ilink_receive(sock, msg);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: ajp_ilink_receive failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel goto cleanup;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ajp_msg_log(r, msg, "ajp_handle_cping_cpong: ajp_ilink_receive packet dump");
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = ajp_msg_get_uint8(msg, &result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rv != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: invalid CPONG message");
03831d35f7499c87d51205817c93e9a8d42c4baestevel goto cleanup;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (result != CMD_AJP13_CPONG) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: awaited CPONG, received %d ",
03831d35f7499c87d51205817c93e9a8d42c4baestevel result);
03831d35f7499c87d51205817c93e9a8d42c4baestevel rv = APR_EGENERAL;
03831d35f7499c87d51205817c93e9a8d42c4baestevel goto cleanup;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevelcleanup:
03831d35f7499c87d51205817c93e9a8d42c4baestevel /* Restore original socket timeout */
03831d35f7499c87d51205817c93e9a8d42c4baestevel rc = apr_socket_timeout_set(sock, org);
03831d35f7499c87d51205817c93e9a8d42c4baestevel if (rc != APR_SUCCESS) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: apr_socket_timeout_set failed");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rc;
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel ap_log_rerror(APLOG_MARK, APLOG_TRACE8, 0, r,
03831d35f7499c87d51205817c93e9a8d42c4baestevel "ajp_handle_cping_cpong: Done");
03831d35f7499c87d51205817c93e9a8d42c4baestevel return rv;
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel#define case_to_str(x) case CMD_AJP13_##x:\
03831d35f7499c87d51205817c93e9a8d42c4baestevel return #x;\
03831d35f7499c87d51205817c93e9a8d42c4baestevel break;
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel/**�
03831d35f7499c87d51205817c93e9a8d42c4baestevel * Convert numeric message type into string
03831d35f7499c87d51205817c93e9a8d42c4baestevel * @param type AJP message type
03831d35f7499c87d51205817c93e9a8d42c4baestevel * @return AJP message type as a string
03831d35f7499c87d51205817c93e9a8d42c4baestevel */
03831d35f7499c87d51205817c93e9a8d42c4baestevelconst char *ajp_type_str(int type)
03831d35f7499c87d51205817c93e9a8d42c4baestevel{
03831d35f7499c87d51205817c93e9a8d42c4baestevel switch (type) {
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(FORWARD_REQUEST)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(SEND_BODY_CHUNK)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(SEND_HEADERS)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(END_RESPONSE)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(GET_BODY_CHUNK)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(SHUTDOWN)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(PING)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(CPONG)
03831d35f7499c87d51205817c93e9a8d42c4baestevel case_to_str(CPING)
03831d35f7499c87d51205817c93e9a8d42c4baestevel default:
03831d35f7499c87d51205817c93e9a8d42c4baestevel return "CMD_AJP13_UNKNOWN";
03831d35f7499c87d51205817c93e9a8d42c4baestevel }
03831d35f7499c87d51205817c93e9a8d42c4baestevel
03831d35f7499c87d51205817c93e9a8d42c4baestevel}
03831d35f7499c87d51205817c93e9a8d42c4baestevel