Mercurial > hg > xemacs-beta
annotate netinstall/nio-http.cc @ 5169:6c6d78781d59
cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-24 Ben Wing <ben@xemacs.org>
* array.h:
* array.h (XD_LISP_DYNARR_DESC):
* dumper.c (pdump_register_sub):
* dumper.c (pdump_store_new_pointer_offsets):
* dumper.c (pdump_reloc_one_mc):
* elhash.c:
* gc.c (lispdesc_one_description_line_size):
* gc.c (kkcc_marking):
* lrecord.h:
* lrecord.h (IF_NEW_GC):
* lrecord.h (enum memory_description_type):
* lrecord.h (enum data_description_entry_flags):
* lrecord.h (struct opaque_convert_functions):
Rename XD_LISP_OBJECT_BLOCK_PTR to XD_INLINE_LISP_OBJECT_BLOCK_PTR
and document it in lrecord.h.
* data.c:
* data.c (finish_marking_weak_lists):
* data.c (continue_marking_ephemerons):
* data.c (finish_marking_ephemerons):
* elhash.c (MARK_OBJ):
* gc.c:
* gc.c (lispdesc_indirect_count_1):
* gc.c (struct):
* gc.c (kkcc_bt_push):
* gc.c (kkcc_gc_stack_push):
* gc.c (kkcc_gc_stack_push_lisp_object):
* gc.c (kkcc_gc_stack_repush_dirty_object):
* gc.c (KKCC_DO_CHECK_FREE):
* gc.c (mark_object_maybe_checking_free):
* gc.c (mark_struct_contents):
* gc.c (mark_lisp_object_block_contents):
* gc.c (register_for_finalization):
* gc.c (mark_object):
* gc.h:
* lisp.h:
* profile.c:
* profile.c (mark_profiling_info_maphash):
Clean up KKCC code related to DEBUG_XEMACS. Rename
kkcc_backtrace() to kkcc_backtrace_1() and add two params: a
`size' arg to control how many stack elements to print and a
`detailed' arg to control whether Lisp objects are printed using
`debug_print()'. Create front-ends to kkcc_backtrace_1() --
kkcc_detailed_backtrace(), kkcc_short_backtrace(),
kkcc_detailed_backtrace_full(), kkcc_short_backtrace_full(), as
well as shortened versions kbt(), kbts(), kbtf(), kbtsf() -- to
call it with various parameter values. Add an `is_lisp' field to
the stack and backtrace structures and use it to keep track of
whether an object pushed onto the stack is a Lisp object or a
non-Lisp structure; in kkcc_backtrace_1(), don't try to print a
non-Lisp structure as a Lisp object.
* elhash.c:
* extents.c:
* file-coding.c:
* lrecord.h:
* lrecord.h (IF_NEW_GC):
* marker.c:
* marker.c (Fmarker_buffer):
* mule-coding.c:
* number.c:
* rangetab.c:
* specifier.c:
New macros IF_OLD_GC(), IF_NEW_GC() to simplify declaration of
Lisp objects when a finalizer may exist in one but not the other.
Use them appropriately.
* extents.c (finalize_extent_info):
Don't zero out data->soe and data->extents before trying to free,
else we get memory leaks.
* lrecord.h (enum lrecord_type):
Make the first lrecord type have value 1 not 0 so that 0 remains
without implementation and attempts to interpret zeroed memory
as a Lisp object will be more obvious.
* array.c (Dynarr_free):
* device-msw.c (msprinter_delete_device):
* device-tty.c (free_tty_device_struct):
* device-tty.c (tty_delete_device):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-x.c:
* emacs.c (free_argc_argv):
* emodules.c (attempt_module_delete):
* file-coding.c (chain_finalize_coding_stream_1):
* file-coding.c (chain_finalize_coding_stream):
* glyphs-eimage.c:
* glyphs-eimage.c (jpeg_instantiate_unwind):
* glyphs-eimage.c (gif_instantiate_unwind):
* glyphs-eimage.c (png_instantiate_unwind):
* glyphs-eimage.c (tiff_instantiate_unwind):
* imgproc.c:
* imgproc.c (build_EImage_quantable):
* insdel.c (uninit_buffer_text):
* mule-coding.c (iso2022_finalize_detection_state):
* objects-tty.c (tty_finalize_color_instance):
* objects-tty.c (tty_finalize_font_instance):
* objects-tty.c (tty_font_list):
* process.c:
* process.c (finalize_process):
* redisplay.c (add_propagation_runes):
* scrollbar-gtk.c:
* scrollbar-gtk.c (gtk_free_scrollbar_instance):
* scrollbar-gtk.c (gtk_release_scrollbar_instance):
* scrollbar-msw.c:
* scrollbar-msw.c (mswindows_free_scrollbar_instance):
* scrollbar-msw.c (unshow_that_mofo):
* scrollbar-x.c (x_free_scrollbar_instance):
* scrollbar-x.c (x_release_scrollbar_instance):
* select-x.c:
* select-x.c (x_handle_selection_request):
* syntax.c:
* syntax.c (uninit_buffer_syntax_cache):
* text.h (eifree):
If possible, whenever we call xfree() on a field in a structure,
set the field to 0 afterwards. A lot of code is written so that
it checks the value being freed to see if it is non-zero before
freeing it -- doing this and setting the value to 0 afterwards
ensures (a) we won't try to free twice if the cleanup code is
called twice; (b) if the object itself stays around, KKCC won't
crash when attempting to mark the freed field.
* rangetab.c:
Add a finalization method when not NEW_GC to avoid memory leaks.
(#### We still get memory leaks when NEW_GC; need to convert gap
array to Lisp object).
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Wed, 24 Mar 2010 01:22:51 -0500 |
parents | 3078fd1074e8 |
children |
rev | line source |
---|---|
448 | 1 /* |
2 * Copyright (c) 2000, Red Hat, Inc. | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * A copy of the GNU General Public License can be found at | |
10 * http://www.gnu.org/ | |
11 * | |
12 * Written by DJ Delorie <dj@cygnus.com> | |
13 * | |
14 */ | |
15 | |
16 /* This file is responsible for implementing all direct HTTP protocol | |
17 channels. It is intentionally simplistic. */ | |
18 | |
19 #include "win32.h" | |
20 #include "winsock.h" | |
21 #include <stdio.h> | |
22 #include <stdlib.h> | |
23 | |
24 #include "resource.h" | |
25 #include "state.h" | |
26 #include "simpsock.h" | |
27 #include "msg.h" | |
28 | |
29 #include "netio.h" | |
30 #include "nio-http.h" | |
31 | |
32 static char six2pr[64] = { | |
33 'A','B','C','D','E','F','G','H','I','J','K','L','M', | |
34 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', | |
35 'a','b','c','d','e','f','g','h','i','j','k','l','m', | |
36 'n','o','p','q','r','s','t','u','v','w','x','y','z', | |
37 '0','1','2','3','4','5','6','7','8','9','+','/' | |
38 }; | |
39 | |
40 static char * | |
41 base64_encode (char *username, char *password) | |
42 { | |
43 unsigned char *ep; | |
44 char *rp; | |
45 static char *rv = 0; | |
46 if (rv) | |
47 free (rv); | |
48 rv = (char *) malloc (2 * (strlen (username) + strlen (password)) + 5); | |
49 | |
50 char *up = (char *) malloc (strlen (username) + strlen (password) + 6); | |
51 strcpy (up, username); | |
52 strcat (up, ":"); | |
53 strcat (up, password); | |
54 ep = (unsigned char *)up + strlen (up); | |
55 *ep++ = 0; | |
56 *ep++ = 0; | |
57 *ep++ = 0; | |
58 | |
59 char block[4]; | |
60 | |
61 rp = rv; | |
62 | |
63 for (ep = (unsigned char *)up; *ep; ep += 3) | |
64 { | |
65 block[0] = six2pr[ep[0] >> 2]; | |
66 block[1] = six2pr[((ep[0] << 4) & 0x30) | ((ep[1] >> 4) & 0x0f)]; | |
67 block[2] = six2pr[((ep[1] << 2) & 0x3c) | ((ep[2] >> 6) & 0x03)]; | |
68 block[3] = six2pr[ep[2] & 0x3f]; | |
69 | |
70 if (ep[1] == 0) | |
71 block[2] = block[3] = '='; | |
72 if (ep[2] == 0) | |
73 block[3] = '='; | |
74 memcpy (rp, block, 4); | |
75 rp += 4; | |
76 } | |
77 *rp = 0; | |
78 | |
79 free (up); | |
80 | |
81 return rv; | |
82 } | |
83 | |
84 NetIO_HTTP::NetIO_HTTP (char *Purl) | |
85 : NetIO (Purl) | |
86 { | |
87 retry_get: | |
88 if (port == 0) | |
89 port = 80; | |
90 | |
91 if (net_method == IDC_NET_PROXY) | |
92 s = new SimpleSocket (net_proxy_host, net_proxy_port); | |
93 else | |
94 s = new SimpleSocket (host, port); | |
95 | |
96 if (!s->ok()) | |
97 { | |
98 s = 0; | |
99 return; | |
100 } | |
101 | |
102 if (net_method == IDC_NET_PROXY) | |
103 s->printf ("GET %s HTTP/1.0\r\n", url); | |
104 else | |
105 s->printf ("GET %s HTTP/1.0\r\n", path); | |
106 s->printf ("Host: %s:%d\r\n", host, port); | |
107 | |
108 if (net_user && net_passwd) | |
109 s->printf ("Authorization: Basic %s\r\n", | |
110 base64_encode (net_user, net_passwd)); | |
111 | |
112 if (net_proxy_user && net_proxy_passwd) | |
113 s->printf ("Proxy-Authorization: Basic %s\r\n", | |
114 base64_encode (net_proxy_user, net_proxy_passwd)); | |
115 | |
116 s->printf ("\r\n"); | |
117 | |
118 char *l = s->gets (); | |
119 int code; | |
120 sscanf (l, "%*s %d", &code); | |
121 if (code >= 300 && code < 400) | |
122 { | |
123 do { | |
124 l = s->gets (); | |
125 if (_strnicmp (l, "Location:", 9) == 0) | |
126 { | |
127 char *u = l + 9; | |
128 while (*u == ' ' || *u == '\t') | |
129 u++; | |
130 set_url (u); | |
131 delete s; | |
132 goto retry_get; | |
133 } | |
134 } while (*l); | |
135 } | |
136 if (code == 401) /* authorization required */ | |
137 { | |
138 get_auth (); | |
139 delete s; | |
140 goto retry_get; | |
141 } | |
142 if (code == 407) /* proxy authorization required */ | |
143 { | |
144 get_proxy_auth (); | |
145 delete s; | |
146 goto retry_get; | |
147 } | |
148 if (code >= 300) | |
149 { | |
150 delete s; | |
151 s = 0; | |
152 return; | |
153 } | |
154 do { | |
155 l = s->gets (); | |
156 if (_strnicmp (l, "Content-Length:", 15) == 0) | |
157 sscanf (l, "%*s %d", &file_size); | |
158 } while (*l); | |
159 } | |
160 | |
161 NetIO_HTTP::~NetIO_HTTP () | |
162 { | |
163 if (s) | |
164 delete s; | |
165 } | |
166 | |
167 int | |
168 NetIO_HTTP::ok () | |
169 { | |
170 if (s) | |
171 return 1; | |
172 return 0; | |
173 } | |
174 | |
175 int | |
176 NetIO_HTTP::read (char *buf, int nbytes) | |
177 { | |
178 return s->read (buf, nbytes); | |
179 } |