| 260 return REQ_ABORTED; |
260 return REQ_ABORTED; |
| 261 } |
261 } |
| 262 |
262 |
| 263 // set server address |
263 // set server address |
| 264 struct addrinfo hints = { 0 }; |
264 struct addrinfo hints = { 0 }; |
| 265 hints.ai_family = AF_UNSPEC; |
265 hints.ai_family = AF_INET; //AF_UNSPEC; |
| 266 hints.ai_socktype = SOCK_STREAM; |
266 hints.ai_socktype = SOCK_STREAM; |
| 267 struct addrinfo *srv_addr; |
267 struct addrinfo *srv_addr; |
| 268 if(getaddrinfo(srvhost, srvport, &hints, &srv_addr)) { |
268 if(getaddrinfo(srvhost, srvport, &hints, &srv_addr)) { |
| 269 http_client_free(client); |
269 http_client_free(client); |
| 270 log_ereport(LOG_FAILURE, "reverse-proxy: getaddr failed for address %s: %s", srvhost, strerror(errno)); |
270 log_ereport(LOG_FAILURE, "reverse-proxy: getaddr failed for address %s: %s", srvhost, strerror(errno)); |
| 271 return REQ_ABORTED; |
271 return REQ_ABORTED; |
| 272 } |
272 } |
| 273 |
273 |
| 274 int ret = http_client_set_addr(client, srv_addr->ai_addr, srv_addr->ai_addrlen); |
274 WSBool addr_set = FALSE; |
| |
275 struct addrinfo *addr = srv_addr; |
| |
276 while(addr) { |
| |
277 if(addr->ai_family == AF_INET || addr->ai_family == AF_INET6) { |
| |
278 if(!http_client_set_addr(client, addr->ai_family, addr->ai_addr, addr->ai_addrlen)) { |
| |
279 addr_set = TRUE; |
| |
280 } |
| |
281 break; |
| |
282 } |
| |
283 |
| |
284 addr = addr->ai_next; |
| |
285 } |
| 275 freeaddrinfo(srv_addr); |
286 freeaddrinfo(srv_addr); |
| 276 if(ret) { |
287 if(!addr_set) { |
| 277 http_client_free(client); |
288 http_client_free(client); |
| 278 return REQ_ABORTED; |
289 return REQ_ABORTED; |
| 279 } |
290 } |
| 280 |
|
| 281 // test address |
|
| 282 struct sockaddr_in address; |
|
| 283 inet_pton(AF_INET, "127.0.0.1", &address.sin_addr); |
|
| 284 address.sin_family = AF_INET; |
|
| 285 address.sin_port = htons(8080); |
|
| 286 http_client_set_addr(client, (struct sockaddr*)&address, sizeof(address)); |
|
| 287 http_client_add_request_header(client, cx_mutstr("host"), cx_mutstr("localhost:8080")); |
|
| 288 |
291 |
| 289 // add request headers to the client |
292 // add request headers to the client |
| 290 CxIterator i = pblock_iterator(rq->headers); |
293 CxIterator i = pblock_iterator(rq->headers); |
| 291 cx_foreach(pb_entry*, entry, i) { |
294 cx_foreach(pb_entry*, entry, i) { |
| 292 cxmutstr header_value; |
295 cxmutstr header_value; |