0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-26 11:45:30 +00:00

fix: 403 found but not header provided

This commit is contained in:
Bin Jin 2010-11-23 02:04:18 +08:00
parent 1b07ca821c
commit d95c791e8b
2 changed files with 61 additions and 49 deletions

View File

@ -92,37 +92,43 @@ static void httpc_read_cb(struct bufferevent *buffev, void *_arg)
dropped = 1; dropped = 1;
} else { } else {
free_null(auth->last_auth_query);
char *auth_request = get_auth_request_header(buffev->input); char *auth_request = get_auth_request_header(buffev->input);
char *ptr = auth_request;
ptr += strlen(auth_request_header); if (!auth_request) {
while (isspace(*ptr)) redsocks_log_error(client, LOG_NOTICE, "403 found, but no proxy auth challenge");
ptr++; redsocks_drop_client(client);
dropped = 1;
} else {
free_null(auth->last_auth_query);
char *ptr = auth_request;
auth->last_auth_query = calloc(strlen(ptr) + 1, 1); ptr += strlen(auth_request_header);
strcpy(auth->last_auth_query, ptr); while (isspace(*ptr))
auth->last_auth_count = 0; ptr++;
free(auth_request); auth->last_auth_query = calloc(strlen(ptr) + 1, 1);
redsocks_log_error(client, LOG_NOTICE, "got challenge %s, restarting now", auth->last_auth_query); strcpy(auth->last_auth_query, ptr);
auth->last_auth_count = 0;
if (bufferevent_disable(client->relay, EV_WRITE)) { free(auth_request);
redsocks_log_errno(client, LOG_ERR, "bufferevent_disable"); redsocks_log_error(client, LOG_NOTICE, "got challenge %s, restarting now", auth->last_auth_query);
if (bufferevent_disable(client->relay, EV_WRITE)) {
redsocks_log_errno(client, LOG_ERR, "bufferevent_disable");
return;
}
/* close relay tunnel */
close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
/* set to initial state*/
client->state = httpc_new;
/* and reconnect */
redsocks_connect_relay(client);
return; return;
} }
/* close relay tunnel */
close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
/* set to initial state*/
client->state = httpc_new;
/* and reconnect */
redsocks_connect_relay(client);
return;
} }
} else if (200 <= code && code <= 299) { } else if (200 <= code && code <= 299) {
client->state = httpc_reply_came; client->state = httpc_reply_came;

View File

@ -160,39 +160,45 @@ static void httpr_relay_read_cb(struct bufferevent *buffev, void *_arg)
dropped = 1; dropped = 1;
} else { } else {
free_null(auth->last_auth_query);
char *auth_request = get_auth_request_header(buffev->input); char *auth_request = get_auth_request_header(buffev->input);
char *ptr = auth_request;
ptr += strlen(auth_request_header); if (!auth_request) {
while (isspace(*ptr)) redsocks_log_error(client, LOG_NOTICE, "403 found, but no proxy auth challenge");
ptr++; redsocks_drop_client(client);
dropped = 1;
} else {
free_null(auth->last_auth_query);
char *ptr = auth_request;
auth->last_auth_query = calloc(strlen(ptr) + 1, 1); ptr += strlen(auth_request_header);
strcpy(auth->last_auth_query, ptr); while (isspace(*ptr))
auth->last_auth_count = 0; ptr++;
free(auth_request); auth->last_auth_query = calloc(strlen(ptr) + 1, 1);
redsocks_log_error(client, LOG_NOTICE, "got challenge %s, restarting now", auth->last_auth_query); strcpy(auth->last_auth_query, ptr);
auth->last_auth_count = 0;
httpr_buffer_fini(&httpr->relay_buffer); free(auth_request);
redsocks_log_error(client, LOG_NOTICE, "got challenge %s, restarting now", auth->last_auth_query);
if (bufferevent_disable(client->relay, EV_WRITE)) { httpr_buffer_fini(&httpr->relay_buffer);
redsocks_log_errno(client, LOG_ERR, "bufferevent_disable");
if (bufferevent_disable(client->relay, EV_WRITE)) {
redsocks_log_errno(client, LOG_ERR, "bufferevent_disable");
return;
}
/* close relay tunnel */
close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
/* set to initial state*/
client->state = httpr_recv_request;
/* and reconnect */
redsocks_connect_relay(client);
return; return;
} }
/* close relay tunnel */
close(EVENT_FD(&client->relay->ev_write));
bufferevent_free(client->relay);
/* set to initial state*/
client->state = httpr_recv_request;
/* and reconnect */
redsocks_connect_relay(client);
return;
} }
} else if (100 <= code && code <= 999) { } else if (100 <= code && code <= 999) {
client->state = httpr_reply_came; client->state = httpr_reply_came;