2 вопроса по CURL

Wicked

Новичок
2 вопроса по CURL

1) Хочу использовать курл для отправки xml-запроса (Content-type: text/xml) методом POST. Но стандартный курловый пост умеет отсылать только application/x-www-form-urlencoded (в случае, когда CURLOPT_POSTFIELDS задаются строкой) или multipart/form-data (в случае, когда CURLOPT_POSTFIELDS задаются массивом) запросы.

Пока что единственным способом делать через курл то, что мне нужно оказалось следующее:
PHP:
$header = array();
$header[] = "Host: xxx.com";
$header[] = "Content-type: text/xml";
$header[] = "Connection: close \r\n";
$header[] = $xml_content;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
Но мне он кажется сделанным через известное место. Есть мысли, как сделать это более элегантно?

2) Есть задача аплоадить скриптом файлы, пришедшие от пользователя, на другой удаленный сервер. И при этом сохранять оригинальное имя файла. Сейчас это сделано через использование собаки в $postvars, что заставляет курл считать файл с диска и послать его.
PHP:
$postvars["file"] = "@".$filename;
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
Но при этом курл при аплоаде передает удаленному серверу именно имя filename($filename). Так что, чтобы зааплоадить файл с оригинальным именем, я должен его с оригиальным же именем сохранить на диске. А это может быть чревато, т.к. файловые системы разные. Может быть кто-нибудь обладает тайным знанием, как добиться назначения кастомных имен при аплоаде, чтобы можно было именовать временные файлы в файловой системе более стандартно (tempnam())?
 

Cornolio

Новичок
Ответ немного не в тему, но всё-таки...
Весь день боролся с cURL, но RAW-запрос отправить так и не удалось, пришлось написать функцию на сокетах.
Если вдруг кому понадобится срочно решить проблему отправки RAW-запроса, можете использовать:

PHP:
function sendRawPostRequest($url, $request_content, $content_type="text/xml"){
	$user_agent="User-Agent: xmlrpc-epi-php/0.2 (PHP)";
	$response_buf = "";
	if ($url) {
		$host=getHostWithoutPortByUrl($url);
		$port=getPortByUrl($url);
		$uri=getUriByUrl($url);
		$content_len = strlen($request_content);
		$query_fd = fsockopen($host, $port, $errno, $errstr, 10);
		if ($query_fd) {
			$auth = "";
			$http_request = 
			"POST $uri HTTP/1.0\r\n" .
			"$user_agent\r\n" .
			"Host: $host:$port\r\n" .
			$auth .
			"Content-Type: $content_type\r\n" .
			"Content-Length: $content_len\r\n" . 
			"\r\n" .
			$request_content;

			fputs($query_fd, $http_request, strlen($http_request));
			while (!feof($query_fd)) {
				$line = fgets($query_fd, 4096);
				if (!$header_parsed) {
					if ($line === "\r\n" || $line === "\n") {
						$header_parsed = 1;
					}
				}
				else {
					$response_buf .= $line;
				}
			}
			fclose($query_fd);
		}
	}
	return $response_buf;
}

function getHostByUrl($url){
	$parts=explode("/",$url);
	if(sizeof($parts)<3){
		return null;
	}
	return $parts[2];
}

function getPortByUrl($url){
	$host=getHostByUrl($url);
	$parts=explode(":",$host);
	if(sizeof($parts)<2){
		return 80;
	}
	return intval($parts[1]);
}

function getHostWithoutPortByUrl($url){
	$host=getHostByUrl($url);
	$parts=explode(":",$host);
	return $parts[0];
}

function getUriByUrl($url){
	$parts=explode("/",$url);
	if(sizeof($parts)<4){
		return "/";
	}
	$result="";
	for($i=3;$i<sizeof($parts);$i++){
		$result.="/".$parts[$i];
	}
	return $result;
}
 

Wicked

Новичок
Cornolio
Весь день боролся с cURL, но RAW-запрос отправить так и не удалось,...
Т.е. var_dump($headers) показывал, что RAW-часть все таки присутствует, но курл ее не отсылал?
 
Сверху