Mercurial > hg > nginx
comparison src/http/ngx_http_upstream_round_robin.c @ 1658:13f8dec720b5
proxy_pass variables support
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 27 Nov 2007 13:34:13 +0000 |
parents | 771c4071f5f6 |
children | abbef7b5dab8 |
comparison
equal
deleted
inserted
replaced
1657:6a8a066adc98 | 1658:13f8dec720b5 |
---|---|
245 return NGX_OK; | 245 return NGX_OK; |
246 } | 246 } |
247 | 247 |
248 | 248 |
249 ngx_int_t | 249 ngx_int_t |
250 ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, | |
251 ngx_http_upstream_resolved_t *ur) | |
252 { | |
253 u_char *p; | |
254 size_t len; | |
255 ngx_uint_t i, n; | |
256 struct sockaddr_in *sin; | |
257 ngx_http_upstream_rr_peers_t *peers; | |
258 ngx_http_upstream_rr_peer_data_t *rrp; | |
259 | |
260 rrp = r->upstream->peer.data; | |
261 | |
262 if (rrp == NULL) { | |
263 rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); | |
264 if (rrp == NULL) { | |
265 return NGX_ERROR; | |
266 } | |
267 | |
268 r->upstream->peer.data = rrp; | |
269 } | |
270 | |
271 peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t) | |
272 + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1)); | |
273 if (peers == NULL) { | |
274 return NGX_ERROR; | |
275 } | |
276 | |
277 peers->single = (ur->naddrs == 1); | |
278 peers->number = ur->naddrs; | |
279 peers->name = &ur->host; | |
280 | |
281 for (i = 0; i < ur->naddrs; i++) { | |
282 | |
283 len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1; | |
284 | |
285 p = ngx_palloc(r->pool, len); | |
286 if (p == NULL) { | |
287 return NGX_ERROR; | |
288 } | |
289 | |
290 len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, INET_ADDRSTRLEN); | |
291 len = ngx_sprintf(&p[len], ":%d", ur->port) - p; | |
292 | |
293 sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); | |
294 if (sin == NULL) { | |
295 return NGX_ERROR; | |
296 } | |
297 | |
298 sin->sin_family = AF_INET; | |
299 sin->sin_port = htons(ur->port); | |
300 sin->sin_addr.s_addr = ur->addrs[i]; | |
301 | |
302 peers->peer[i].sockaddr = (struct sockaddr *) sin; | |
303 peers->peer[i].socklen = sizeof(struct sockaddr_in); | |
304 peers->peer[i].name.len = len; | |
305 peers->peer[i].name.data = p; | |
306 peers->peer[i].weight = 1; | |
307 peers->peer[i].current_weight = 1; | |
308 peers->peer[i].max_fails = 1; | |
309 peers->peer[i].fail_timeout = 10; | |
310 } | |
311 | |
312 rrp->peers = peers; | |
313 rrp->current = 0; | |
314 | |
315 if (rrp->peers->number <= 8 * sizeof(uintptr_t)) { | |
316 rrp->tried = &rrp->data; | |
317 rrp->data = 0; | |
318 | |
319 } else { | |
320 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) | |
321 / (8 * sizeof(uintptr_t)); | |
322 | |
323 rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); | |
324 if (rrp->tried == NULL) { | |
325 return NGX_ERROR; | |
326 } | |
327 } | |
328 | |
329 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; | |
330 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; | |
331 r->upstream->peer.tries = rrp->peers->number; | |
332 #if (NGX_HTTP_SSL) | |
333 r->upstream->peer.set_session = | |
334 ngx_http_upstream_set_round_robin_peer_session; | |
335 r->upstream->peer.save_session = | |
336 ngx_http_upstream_save_round_robin_peer_session; | |
337 #endif | |
338 | |
339 return NGX_OK; | |
340 } | |
341 | |
342 | |
343 ngx_int_t | |
250 ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) | 344 ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) |
251 { | 345 { |
252 ngx_http_upstream_rr_peer_data_t *rrp = data; | 346 ngx_http_upstream_rr_peer_data_t *rrp = data; |
253 | 347 |
254 time_t now; | 348 time_t now; |