Commit b223a43c317ad9b16d77a16c12af6403cb032e8b

Authored by David RENÉ
1 parent 6f771698

add missing data attribute which contain phone number

remove force_nth which is now in anubis standard library
Showing 1 changed file with 305 additions and 305 deletions   Show diff stats
web/CXM_http_get_common.anubis
1 -  
2 - *Project* The Anubis Project  
3 -  
4 - *Title* Getting a document from the Web.  
5 -  
6 - *Copyright* Copyright (c) Alain Prouté 2001.  
7 -  
8 -  
9 - *Author* Alain Prouté  
10 -  
11 -  
12 -  
13 - This file contains the types and functions which are common to 'http_get' and  
14 - 'https_get'.  
15 -  
16 -read tools/basis.anubis  
17 -read tools/findstring.anubis  
18 -read system/string.anubis  
19 -read CXM_common.anubis  
20 - read web/html.anubis  
21 -  
22 -  
23 -  
24 - Body of HTTP requests may also contain name-value pairs. We call them HTTP arguments:  
25 -  
26 -public type HTTP_argument:  
27 - http_argument(String name, String value).  
28 -  
29 -  
30 -  
31 - We begin by several simple tools.  
32 -  
33 - 'crlf' and 'crlfcrlf' are defined in 'basis.anubis'.  
34 -  
35 -public define Maybe(Int)  
36 - has_double_crlf  
37 - (  
38 - String s,  
39 - ) =  
40 - find(crlfcrlf,s,0).  
41 -  
42 -  
43 -  
44 -  
45 - Formatting a list of HTTP arguments.  
46 -  
47 -public define String  
48 - format_http_args  
49 - (  
50 - List(HTTP_argument) l  
51 - ) =  
52 - if l is  
53 - {  
54 - [ ] then "",  
55 - [h . t] then  
56 - if t is  
57 - {  
58 - [ ] then if h is http_argument(n,v) then n + "=" + v,  
59 - [_ . _] then if h is http_argument(n,v) then n + "=" + v + "&" + format_http_args(t)  
60 - }  
61 - }.  
62 -  
63 -  
64 -  
65 - Formatting the headers.  
66 -  
67 -public define String  
68 - format_headers  
69 - (  
70 - List(HTTP_header) headers  
71 - ) =  
72 - if headers is  
73 - {  
74 - [ ] then "",  
75 - [h . t] then if h is http_header(n,v) then  
76 - n + ": " + v + crlf + format_headers(t)  
77 - }.  
78 -  
79 -  
80 -  
81 -  
82 -  
83 -public define String  
84 - format  
85 - (  
86 - DNS_Result r  
87 - ) =  
88 - if r is  
89 - {  
90 - host_not_found then "host not found",  
91 - no_address_found then "no address found for this host",  
92 - try_again then "DNS server is busy, try again later",  
93 - non_recoverable_error then "non recoverable DNS error",  
94 - ok(n) then should_not_happen("ok") // should never happen  
95 - }.  
96 -  
97 -  
98 -public define String  
99 - format  
100 - (  
101 - NetworkConnectError e  
102 - ) =  
103 - if e is  
104 - {  
105 - cannot_create_the_socket then "cannot create the socket",  
106 - address_port_not_available then "address:port not available",  
107 - connection_refused then "connection refused",  
108 - network_unreachable then "network is unreachable",  
109 - address_port_already_in_use then "address:port already in use",  
110 - out_of_time then "out of time"  
111 - }.  
112 -  
113 -public define String  
114 - format  
115 - (  
116 - SSLConnectError e  
117 - ) =  
118 - if e is  
119 - {  
120 - tcp_error(nce) then format(nce),  
121 - cannot_create_SSL_object then "cannot create SSL object",  
122 - cannot_connect_under_SSL then "cannot connect under SSL",  
123 - cannot_trust_server_certificate then "cannot trust server certificate"  
124 - }.  
125 -  
126 -  
127 -  
128 - The next function empties the standard input (the keybord normally).  
129 -  
130 -define One  
131 - empty_stdin  
132 - (  
133 - One dummy  
134 - ) =  
135 - if *stdin is  
136 - {  
137 - failure then unique,  
138 - success(c) then  
139 - if c = 10  
140 - then unique  
141 - else empty_stdin(dummy)  
142 - }.  
143 -  
144 -  
145 - The next function returns true if the user answers Y or y.  
146 -  
147 -public define Bool  
148 - yes  
149 - =  
150 - if *stdin is  
151 - {  
152 - failure then should_not_happen(false), // this can never happen, because stdin is never closed  
153 - success(c) then  
154 - empty_stdin(unique);  
155 - (c = 'Y' | c = 'y')  
156 - }.  
157 -  
158 -  
159 -  
160 - Separating the server name from the port.  
161 -  
162 -public define (String,Word32)  
163 - separate_name_port  
164 - (  
165 - String server_name,  
166 - Word32 default_port  
167 - ) =  
168 - if find(":",server_name,0) is  
169 - {  
170 - failure then (server_name,default_port),  
171 - success(n) then  
172 - (substr(server_name,0,n),  
173 - if decimal_scan(substr(server_name,n+1,length(server_name)-n-1)) is  
174 - {  
175 - failure then default_port,  
176 - success(p) then truncate_to_Word32(p)  
177 - })  
178 - }.  
179 -  
180 -  
181 -  
182 -  
183 -  
184 - Separating the headers. The headers are comming in the form of a unique string. They  
185 - should be put in the form of a list of pairs of strings (one list element per header).  
186 -  
187 - We do that in two steps. (1) separate the headers into a list of strings (one per  
188 - header), and (2) separate each string into a pair of strings (name,value).  
189 -  
190 -  
191 -define HTTP_header  
192 - separate_header  
193 - (  
194 - String header,  
195 - Int i  
196 - ) =  
197 - if nth(i,header) is  
198 - {  
199 - failure then http_header(header,""),  
200 - success(c) then  
201 - if c = ':' // separator  
202 - then http_header(substr(header,0,i),substr(header,i+1,length(header)-i-1))  
203 - else separate_header(header,i+1)  
204 - }.  
205 -  
206 -  
207 - Headers are separated from each other by CRLF not followed by a blank character.  
208 -  
209 -define List(HTTP_header)  
210 - separate_headers  
211 - (  
212 - String headers,  
213 - Int start,  
214 - ) =  
215 - if find("\r\n",headers,start) is  
216 - {  
217 - failure then [separate_header(substr(headers,start,length(headers)-start),0)],  
218 - success(end) then  
219 - [separate_header(substr(headers,start,end-start),0) . separate_headers(headers,end+2)]  
220 - }.  
221 -  
222 -public define List(HTTP_header)  
223 - separate_headers  
224 - (  
225 - String headers,  
226 - ) =  
227 - separate_headers(headers,0).  
228 -  
229 -  
230 -public define One  
231 - print_headers  
232 - (  
233 - List(HTTP_header) headers  
234 - ) =  
235 - if headers is  
236 - {  
237 - [ ] then unique,  
238 - [h . t] then  
239 - if h is http_header(l,r) then  
240 - print(" "); print(l); print(": "); print(r); print("\n"); print_headers(t)  
241 - }.  
242 -  
243 -  
244 -public define Word8  
245 - force_nth  
246 - (  
247 - Int n,  
248 - String s  
249 - ) =  
250 - if nth(n,s) is  
251 - {  
252 - failure then 0,  
253 - success(c) then c  
254 - }.  
255 -  
256 -  
257 -public define List(HTTP_header)  
258 - get_headers  
259 - (  
260 - List(String) args  
261 - ) =  
262 - if args is  
263 - {  
264 - [ ] then [ ],  
265 - [h . t] then if nth(0,h) is  
266 - {  
267 - failure then should_not_happen([]),  
268 - success(c) then if c = '='  
269 - then if t is  
270 - {  
271 - [ ] then [http_header(substr(h,1,length(h)-1),"")],  
272 - [u . v] then [http_header(substr(h,1,length(h)-1),u) . get_headers(v)]  
273 - }  
274 - else get_headers(t)  
275 - }  
276 - }.  
277 -  
278 -public define List(HTTP_argument)  
279 - get_arguments  
280 - (  
281 - List(String) args  
282 - ) =  
283 - if args is  
284 - {  
285 - [ ] then [ ],  
286 - [h . t] then if nth(0,h) is  
287 - {  
288 - failure then should_not_happen([]),  
289 - success(c) then if c = '='  
290 - then if t is  
291 - {  
292 - [ ] then [ ],  
293 - [u . v] then get_arguments(v)  
294 - }  
295 - else if c = '-'  
296 - then get_arguments(t)  
297 - else if t is  
298 - {  
299 - [ ] then [http_argument(h,"")],  
300 - [u . v] then [http_argument(h,u) . get_arguments(v)]  
301 - }  
302 - }  
303 - }.  
304 -  
305 - 1 +
  2 + *Project* The Anubis Project
  3 +
  4 + *Title* Getting a document from the Web.
  5 +
  6 + *Copyright* Copyright (c) Alain Prouté 2001.
  7 +
  8 +
  9 + *Author* Alain Prouté
  10 +
  11 +
  12 +
  13 + This file contains the types and functions which are common to 'http_get' and
  14 + 'https_get'.
  15 +
  16 +read tools/basis.anubis
  17 +read tools/findstring.anubis
  18 +read system/string.anubis
  19 +read CXM_common.anubis
  20 + read web/html.anubis
  21 +
  22 +
  23 +
  24 + Body of HTTP requests may also contain name-value pairs. We call them HTTP arguments:
  25 +
  26 +public type HTTP_argument:
  27 + http_argument(String name, String value).
  28 +
  29 +
  30 +
  31 + We begin by several simple tools.
  32 +
  33 + 'crlf' and 'crlfcrlf' are defined in 'basis.anubis'.
  34 +
  35 +public define Maybe(Int)
  36 + has_double_crlf
  37 + (
  38 + String s,
  39 + ) =
  40 + find(crlfcrlf,s,0).
  41 +
  42 +
  43 +
  44 +
  45 + Formatting a list of HTTP arguments.
  46 +
  47 +public define String
  48 + format_http_args
  49 + (
  50 + List(HTTP_argument) l
  51 + ) =
  52 + if l is
  53 + {
  54 + [ ] then "",
  55 + [h . t] then
  56 + if t is
  57 + {
  58 + [ ] then if h is http_argument(n,v) then n + "=" + v,
  59 + [_ . _] then if h is http_argument(n,v) then n + "=" + v + "&" + format_http_args(t)
  60 + }
  61 + }.
  62 +
  63 +
  64 +
  65 + Formatting the headers.
  66 +
  67 +public define String
  68 + format_headers
  69 + (
  70 + List(HTTP_header) headers
  71 + ) =
  72 + if headers is
  73 + {
  74 + [ ] then "",
  75 + [h . t] then if h is http_header(n,v) then
  76 + n + ": " + v + crlf + format_headers(t)
  77 + }.
  78 +
  79 +
  80 +
  81 +
  82 +
  83 +public define String
  84 + format
  85 + (
  86 + DNS_Result r
  87 + ) =
  88 + if r is
  89 + {
  90 + host_not_found then "host not found",
  91 + no_address_found then "no address found for this host",
  92 + try_again then "DNS server is busy, try again later",
  93 + non_recoverable_error then "non recoverable DNS error",
  94 + ok(n) then should_not_happen("ok") // should never happen
  95 + }.
  96 +
  97 +
  98 +public define String
  99 + format
  100 + (
  101 + NetworkConnectError e
  102 + ) =
  103 + if e is
  104 + {
  105 + cannot_create_the_socket then "cannot create the socket",
  106 + address_port_not_available then "address:port not available",
  107 + connection_refused then "connection refused",
  108 + network_unreachable then "network is unreachable",
  109 + address_port_already_in_use then "address:port already in use",
  110 + out_of_time then "out of time"
  111 + }.
  112 +
  113 +public define String
  114 + format
  115 + (
  116 + SSLConnectError e
  117 + ) =
  118 + if e is
  119 + {
  120 + tcp_error(nce) then format(nce),
  121 + cannot_create_SSL_object then "cannot create SSL object",
  122 + cannot_connect_under_SSL then "cannot connect under SSL",
  123 + cannot_trust_server_certificate then "cannot trust server certificate"
  124 + }.
  125 +
  126 +
  127 +
  128 + The next function empties the standard input (the keybord normally).
  129 +
  130 +define One
  131 + empty_stdin
  132 + (
  133 + One dummy
  134 + ) =
  135 + if *stdin is
  136 + {
  137 + failure then unique,
  138 + success(c) then
  139 + if c = 10
  140 + then unique
  141 + else empty_stdin(dummy)
  142 + }.
  143 +
  144 +
  145 + The next function returns true if the user answers Y or y.
  146 +
  147 +public define Bool
  148 + yes
  149 + =
  150 + if *stdin is
  151 + {
  152 + failure then should_not_happen(false), // this can never happen, because stdin is never closed
  153 + success(c) then
  154 + empty_stdin(unique);
  155 + (c = 'Y' | c = 'y')
  156 + }.
  157 +
  158 +
  159 +
  160 + Separating the server name from the port.
  161 +
  162 +public define (String,Word32)
  163 + separate_name_port
  164 + (
  165 + String server_name,
  166 + Word32 default_port
  167 + ) =
  168 + if find(":",server_name,0) is
  169 + {
  170 + failure then (server_name,default_port),
  171 + success(n) then
  172 + (substr(server_name,0,n),
  173 + if decimal_scan(substr(server_name,n+1,length(server_name)-n-1)) is
  174 + {
  175 + failure then default_port,
  176 + success(p) then truncate_to_Word32(p)
  177 + })
  178 + }.
  179 +
  180 +
  181 +
  182 +
  183 +
  184 + Separating the headers. The headers are comming in the form of a unique string. They
  185 + should be put in the form of a list of pairs of strings (one list element per header).
  186 +
  187 + We do that in two steps. (1) separate the headers into a list of strings (one per
  188 + header), and (2) separate each string into a pair of strings (name,value).
  189 +
  190 +
  191 +define HTTP_header
  192 + separate_header
  193 + (
  194 + String header,
  195 + Int i
  196 + ) =
  197 + if nth(i,header) is
  198 + {
  199 + failure then http_header(header,""),
  200 + success(c) then
  201 + if c = ':' // separator
  202 + then http_header(substr(header,0,i),substr(header,i+1,length(header)-i-1))
  203 + else separate_header(header,i+1)
  204 + }.
  205 +
  206 +
  207 + Headers are separated from each other by CRLF not followed by a blank character.
  208 +
  209 +define List(HTTP_header)
  210 + separate_headers
  211 + (
  212 + String headers,
  213 + Int start,
  214 + ) =
  215 + if find("\r\n",headers,start) is
  216 + {
  217 + failure then [separate_header(substr(headers,start,length(headers)-start),0)],
  218 + success(end) then
  219 + [separate_header(substr(headers,start,end-start),0) . separate_headers(headers,end+2)]
  220 + }.
  221 +
  222 +public define List(HTTP_header)
  223 + separate_headers
  224 + (
  225 + String headers,
  226 + ) =
  227 + separate_headers(headers,0).
  228 +
  229 +
  230 +public define One
  231 + print_headers
  232 + (
  233 + List(HTTP_header) headers
  234 + ) =
  235 + if headers is
  236 + {
  237 + [ ] then unique,
  238 + [h . t] then
  239 + if h is http_header(l,r) then
  240 + print(" "); print(l); print(": "); print(r); print("\n"); print_headers(t)
  241 + }.
  242 +
  243 +
  244 +//public define Word8
  245 +// force_nth
  246 +// (
  247 +// Int n,
  248 +// String s
  249 +// ) =
  250 +// if nth(n,s) is
  251 +// {
  252 +// failure then 0,
  253 +// success(c) then c
  254 +// }.
  255 +
  256 +
  257 +public define List(HTTP_header)
  258 + get_headers
  259 + (
  260 + List(String) args
  261 + ) =
  262 + if args is
  263 + {
  264 + [ ] then [ ],
  265 + [h . t] then if nth(0,h) is
  266 + {
  267 + failure then should_not_happen([]),
  268 + success(c) then if c = '='
  269 + then if t is
  270 + {
  271 + [ ] then [http_header(substr(h,1,length(h)-1),"")],
  272 + [u . v] then [http_header(substr(h,1,length(h)-1),u) . get_headers(v)]
  273 + }
  274 + else get_headers(t)
  275 + }
  276 + }.
  277 +
  278 +public define List(HTTP_argument)
  279 + get_arguments
  280 + (
  281 + List(String) args
  282 + ) =
  283 + if args is
  284 + {
  285 + [ ] then [ ],
  286 + [h . t] then if nth(0,h) is
  287 + {
  288 + failure then should_not_happen([]),
  289 + success(c) then if c = '='
  290 + then if t is
  291 + {
  292 + [ ] then [ ],
  293 + [u . v] then get_arguments(v)
  294 + }
  295 + else if c = '-'
  296 + then get_arguments(t)
  297 + else if t is
  298 + {
  299 + [ ] then [http_argument(h,"")],
  300 + [u . v] then [http_argument(h,u) . get_arguments(v)]
  301 + }
  302 + }
  303 + }.
  304 +
  305 +