Index: t3lib/class.t3lib_div.php =================================================================== --- t3lib/class.t3lib_div.php (revision 9198) +++ t3lib/class.t3lib_div.php (working copy) @@ -2952,14 +2952,54 @@ return false; } $method = ($includeHeader == 2) ? 'HEAD' : 'GET'; + $msgPart2 = ''; + if (!is_null($postFields)) { + $method = 'POST'; + $boundary = '----------' . uniqid('part_'); + if (is_array($postFields)) { + // array, so make request headers + if ($requestHeaders === FALSE) { + // if no request headers are given an array is started + $requestHeaders = array(); + } + // setup the headers + $msgPart2 .= CRLF . 'Content-Type: multipart/form-data, boundary=' . $boundary; + $requestHeaders[] = ''; + foreach ($postFields as $fieldName => $fieldValue) { + $requestHeaders[] = '--' . $boundary; + $requestHeaders[] = 'Content-Disposition: form-data; name="' . $fieldName . '"'; + $requestHeaders[] = ''; + $requestHeaders[] = $fieldValue; + } + $requestHeaders[] = '--' . $boundary . '--'; + } else if (t3lib_div::isFirstPartOfStr($postFields, '@')) { + // file upload + $msgPart2 .= CRLF . 'Content-Type: multipart/form-data, boundary=' . $boundary; + $requestHeaders[] = ''; + $filename = substr($postFields, 1); + $requestHeaders[] = '--' . $boundary; + $requestHeaders[] = 'Content-Disposition: form-data; name="fileupload"; filename="' . basename($filename) . '"'; + $requestHeaders[] = 'Content-Type: application/octet-stream'; + $requestHeaders[] = ''; + $requestHeaders[] = self::getURL($filename); + $requestHeaders[] = '--' . $boundary . '--'; + } else { + // as query string + $msgPart2 .= CRLF . 'Content-Type: application/x-www-form-urlencoded'; + $requestHeaders[] = ''; + $requestHeaders[] = $postFields; + } + } $msg = $method . ' ' . $parsedURL['path'] . ($parsedURL['query'] ? '?' . $parsedURL['query'] : '') . ' HTTP/1.0' . CRLF . 'Host: ' . - $parsedURL['host'] . "\r\nConnection: close\r\n"; + $parsedURL['host'] . CRLF . "Connection: close"; + $msgPart3 = ''; if (is_array($requestHeaders)) { - $msg .= implode(CRLF, $requestHeaders) . CRLF; + $msgPart3 .= CRLF . implode(CRLF, $requestHeaders) . CRLF; + $msgPart2 .= CRLF . 'Content-Length: ' . strlen($msgPart3); } - $msg .= CRLF; + $msg .= $msgPart2 . $msgPart3 . CRLF . CRLF; fputs($fp, $msg); while (!feof($fp)) { @@ -3006,6 +3046,59 @@ $report['error'] = $phpError['type']; $report['message'] = $phpError['message']; } + } else if (!is_null($postFields)) { + if (isset($report)) { + $report['lib'] = 'file/context'; + } + $parsedURL = parse_url($url); + if (!preg_match('/^https?/', $parsedURL['scheme'])) { + if (isset($report)) { + $report['error'] = -1; + $report['message'] = 'Sending POST headers is not allowed for this protocol.'; + } + return false; + } + $boundary = '----------' . uniqid('part_'); + $dataLines = array(); + if (is_array($postFields)) { + // setup the headers + $header .= 'Content-Type: multipart/form-data, boundary=' . $boundary; + foreach ($postFields as $fieldName => $fieldValue) { + $dataLines[] = '--' . $boundary; + $dataLines[] = 'Content-Disposition: form-data; name="' . $fieldName . '"'; + $dataLines[] = ''; + $dataLines[] = $fieldValue; + } + $dataLines[] = '--' . $boundary . '--'; + } else if (t3lib_div::isFirstPartOfStr($postFields, '@')) { + // file upload + $header .= 'Content-Type: multipart/form-data, boundary=' . $boundary; + $filename = substr($postFields, 1); + $dataLines[] = '--' . $boundary; + $dataLines[] = 'Content-Disposition: form-data; name="fileupload"; filename="' . basename($filename) . '"'; + $dataLines[] = 'Content-Type: application/octet-stream'; + $dataLines[] = ''; + $dataLines[] = self::getURL($filename); + $dataLines[] = '--' . $boundary . '--'; + } else { + // as query string + $header .= 'Content-Type: application/x-www-form-urlencoded'; + $dataLines[] = $postFields; + } + $ctx = stream_context_create(array( + 'http' => array( + 'method' => 'POST', + 'header' => $header, + 'content' => implode(CRLF, $dataLines), + ) + ) + ); + $content = @file_get_contents($url, false, $ctx); + if ($content === false && isset($report)) { + $phpError = error_get_last(); + $report['error'] = $phpError['type']; + $report['message'] = $phpError['message']; + } } else { if (isset($report)) { $report['lib'] = 'file';