| 2803 | } |
| 2804 | |
| 2805 | static void |
| 2806 | close_connection(int cnum) |
| 2807 | { |
| 2808 | int url_num; |
| 2809 | |
| 2810 | if (!connections[cnum].reusable) { |
| 2811 | struct epoll_event ev; |
| 2812 | |
| 2813 | ev.events = EPOLLIN | EPOLLOUT; |
| 2814 | ev.data.u32 = cnum; |
| 2815 | if (epoll_ctl(epfd, EPOLL_CTL_DEL, connections[cnum].conn_fd, &ev) < 0) |
| 2816 | perror("epoll delete fd"); |
| 2817 | if (urls[connections[cnum].url_num].protocol == PROTO_HTTPS && connections[cnum].ssl != NULL) |
| 2818 | SSL_free(connections[cnum].ssl); |
| 2819 | (void)close(connections[cnum].conn_fd); |
| 2820 | } else { |
| 2821 | --connections[cnum].keep_alive; |
| 2822 | } |
| 2823 | connections[cnum].conn_state = CNST_FREE; |
| 2824 | if (connections[cnum].idle_timer != (Timer *)0) |
| 2825 | tmr_cancel(connections[cnum].idle_timer); |
| 2826 | if (connections[cnum].wakeup_timer != (Timer *)0) |
| 2827 | tmr_cancel(connections[cnum].wakeup_timer); |
| 2828 | --num_connections; |
| 2829 | ++fetches_completed; |
| 2830 | total_bytes += connections[cnum].bytes; |
| 2831 | if (connections[cnum].did_connect) { |
| 2832 | long long connect_usecs = delta_timeval(&connections[cnum].connect_at, &connections[cnum].request_at); |
| 2833 | /* |
| 2834 | if ( connect_usecs > ( max_connect_usecs << 3 ) && max_connect_usecs ) |
| 2835 | connect_usecs = max_connect_usecs; |
| 2836 | */ |
| 2837 | total_connect_usecs += connect_usecs; |
| 2838 | max_connect_usecs = max(max_connect_usecs, connect_usecs); |
| 2839 | min_connect_usecs = min(min_connect_usecs, connect_usecs); |
| 2840 | ++connects_completed; |
| 2841 | } |
| 2842 | if (connections[cnum].did_response) { |
| 2843 | long long response_usecs = delta_timeval(&connections[cnum].request_at, &connections[cnum].response_at); |
| 2844 | /* |
| 2845 | if ( response_usecs > ( max_response_usecs << 1 ) && max_response_usecs ) |
| 2846 | response_usecs = max_response_usecs; |
| 2847 | */ |
| 2848 | total_response_usecs += response_usecs; |
| 2849 | max_response_usecs = max(max_response_usecs, response_usecs); |
| 2850 | min_response_usecs = min(min_response_usecs, response_usecs); |
| 2851 | ++responses_completed; |
| 2852 | } |
| 2853 | if (connections[cnum].http_status >= 0 && connections[cnum].http_status <= 999) { |
| 2854 | ++http_status_counts[connections[cnum].http_status]; |
| 2855 | connections[cnum].stats.responses++; |
| 2856 | } |
| 2857 | |
| 2858 | url_num = connections[cnum].url_num; |
| 2859 | |
| 2860 | /* Only check to update got_bytes, byte count errors and/or checksums |
| 2861 | if the request was successful (i.e. no HTTP error). */ |
| 2862 | if (connections[cnum].http_status >= 0 && connections[cnum].http_status < 400) { |
no test coverage detected