Mercurial > pidgin
comparison libpurple/proxy.c @ 23016:1c7896012802
applied changes from 43cf42d58f68c1f3f9ae27b10c66dbc351612f30
through 0130292e82764988f2d833f4a5d3ff5523f2eb7f
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 19 Jun 2008 02:55:19 +0000 |
parents | 5a0186edda97 |
children | 8a1798bcddc6 |
comparison
equal
deleted
inserted
replaced
23015:c1b8ee4df034 | 23016:1c7896012802 |
---|---|
835 return; | 835 return; |
836 } | 836 } |
837 } | 837 } |
838 | 838 |
839 static void | 839 static void |
840 http_canwrite(gpointer data, gint source, PurpleInputCondition cond) | 840 http_start_connect_tunneling(PurpleProxyConnectData *connect_data) { |
841 { | |
842 GString *request; | 841 GString *request; |
843 PurpleProxyConnectData *connect_data; | |
844 int error = ETIMEDOUT; | |
845 int ret; | 842 int ret; |
846 | |
847 connect_data = data; | |
848 | |
849 purple_debug_info("proxy", "Connected to %s:%d.\n", | |
850 connect_data->host, connect_data->port); | |
851 | |
852 if (connect_data->inpa > 0) | |
853 { | |
854 purple_input_remove(connect_data->inpa); | |
855 connect_data->inpa = 0; | |
856 } | |
857 | |
858 ret = purple_input_get_error(connect_data->fd, &error); | |
859 if ((ret != 0) || (error != 0)) | |
860 { | |
861 if (ret != 0) | |
862 error = errno; | |
863 purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); | |
864 return; | |
865 } | |
866 | 843 |
867 purple_debug_info("proxy", "Using CONNECT tunneling for %s:%d\n", | 844 purple_debug_info("proxy", "Using CONNECT tunneling for %s:%d\n", |
868 connect_data->host, connect_data->port); | 845 connect_data->host, connect_data->port); |
869 | 846 |
870 request = g_string_sized_new(4096); | 847 request = g_string_sized_new(4096); |
910 connect_data->written_len = 0; | 887 connect_data->written_len = 0; |
911 connect_data->read_cb = http_canread; | 888 connect_data->read_cb = http_canread; |
912 | 889 |
913 connect_data->inpa = purple_input_add(connect_data->fd, | 890 connect_data->inpa = purple_input_add(connect_data->fd, |
914 PURPLE_INPUT_WRITE, proxy_do_write, connect_data); | 891 PURPLE_INPUT_WRITE, proxy_do_write, connect_data); |
915 proxy_do_write(connect_data, connect_data->fd, cond); | 892 proxy_do_write(connect_data, connect_data->fd, PURPLE_INPUT_WRITE); |
893 } | |
894 | |
895 static void | |
896 http_canwrite(gpointer data, gint source, PurpleInputCondition cond) { | |
897 PurpleProxyConnectData *connect_data = data; | |
898 int ret, error = ETIMEDOUT; | |
899 | |
900 purple_debug_info("proxy", "Connected to %s:%d.\n", | |
901 connect_data->host, connect_data->port); | |
902 | |
903 if (connect_data->inpa > 0) { | |
904 purple_input_remove(connect_data->inpa); | |
905 connect_data->inpa = 0; | |
906 } | |
907 | |
908 ret = purple_input_get_error(connect_data->fd, &error); | |
909 if (ret != 0 || error != 0) { | |
910 if (ret != 0) | |
911 error = errno; | |
912 purple_proxy_connect_data_disconnect(connect_data, g_strerror(error)); | |
913 return; | |
914 } | |
915 | |
916 if (connect_data->port == 80) { | |
917 /* | |
918 * If we're trying to connect to something running on | |
919 * port 80 then we assume the traffic using this | |
920 * connection is going to be HTTP traffic. If it's | |
921 * not then this will fail (uglily). But it's good | |
922 * to avoid using the CONNECT method because it's | |
923 * not always allowed. | |
924 */ | |
925 purple_debug_info("proxy", "HTTP proxy connection established\n"); | |
926 purple_proxy_connect_data_connected(connect_data); | |
927 } else { | |
928 http_start_connect_tunneling(connect_data); | |
929 } | |
930 | |
916 } | 931 } |
917 | 932 |
918 static void | 933 static void |
919 proxy_connect_http(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen) | 934 proxy_connect_http(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen) |
920 { | 935 { |
938 fcntl(connect_data->fd, F_SETFL, flags | O_NONBLOCK); | 953 fcntl(connect_data->fd, F_SETFL, flags | O_NONBLOCK); |
939 #ifndef _WIN32 | 954 #ifndef _WIN32 |
940 fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC); | 955 fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC); |
941 #endif | 956 #endif |
942 | 957 |
943 if (connect(connect_data->fd, addr, addrlen) != 0) | 958 if (connect(connect_data->fd, addr, addrlen) != 0) { |
944 { | 959 if (errno == EINPROGRESS || errno == EINTR) { |
945 if ((errno == EINPROGRESS) || (errno == EINTR)) | |
946 { | |
947 purple_debug_info("proxy", "Connection in progress\n"); | 960 purple_debug_info("proxy", "Connection in progress\n"); |
948 | 961 |
949 if (connect_data->port != 80) | 962 connect_data->inpa = purple_input_add(connect_data->fd, |
950 { | 963 PURPLE_INPUT_WRITE, http_canwrite, connect_data); |
951 /* we need to do CONNECT first */ | 964 } else |
952 connect_data->inpa = purple_input_add(connect_data->fd, | |
953 PURPLE_INPUT_WRITE, http_canwrite, connect_data); | |
954 } | |
955 else | |
956 { | |
957 /* | |
958 * If we're trying to connect to something running on | |
959 * port 80 then we assume the traffic using this | |
960 * connection is going to be HTTP traffic. If it's | |
961 * not then this will fail (uglily). But it's good | |
962 * to avoid using the CONNECT method because it's | |
963 * not always allowed. | |
964 */ | |
965 purple_debug_info("proxy", "HTTP proxy connection established\n"); | |
966 purple_proxy_connect_data_connected(connect_data); | |
967 } | |
968 } | |
969 else | |
970 { | |
971 purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); | 965 purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno)); |
972 } | 966 } else { |
973 } | |
974 else | |
975 { | |
976 purple_debug_info("proxy", "Connected immediately.\n"); | 967 purple_debug_info("proxy", "Connected immediately.\n"); |
977 | 968 |
978 http_canwrite(connect_data, connect_data->fd, PURPLE_INPUT_WRITE); | 969 http_canwrite(connect_data, connect_data->fd, PURPLE_INPUT_WRITE); |
979 } | 970 } |
980 } | 971 } |