Skip to content

Instantly share code, notes, and snippets.

@lord-alfred
Created January 18, 2019 20:47
Show Gist options
  • Save lord-alfred/944833cd8d22f7b873e72437a91ca7a0 to your computer and use it in GitHub Desktop.
Save lord-alfred/944833cd8d22f7b873e72437a91ca7a0 to your computer and use it in GitHub Desktop.
public class HttpHeadersChecker
{
public static void SplitResponse(IZennoPosterProjectModel project, string response) {
// разбиваем заголовки и содержимое ответа сервера
response = response.Trim();
// разделитель заголовков и содержимого
string[] separator = new string[] {"\r\n\r\n"};
// массив заголовков и содержимого (содержимое тоже может быть разбито на части)
string[] headers_and_body = response.Split(separator, StringSplitOptions.RemoveEmptyEntries);
// все заголовк строкой
string headers = String.Empty;
// всё содержимое строкой
string body = String.Empty;
// индикатор того, что заголовки закончились
bool headers_end = false;
// итерируем по разбитым по разделителю данным (массиву)
foreach(string piece in headers_and_body) {
// если заголовки не закончились и текущая часть начинается с 'http/' в любом регистре (не уверен насчет регистра, но пусть лучше будет так)
if(!headers_end && piece.StartsWith("HTTP/", StringComparison.OrdinalIgnoreCase)) {
// это ещё заголовок
headers = string.Concat(headers, separator[0] , piece);
} else {
// это уже содержимое
body = string.Concat(body, separator[0], piece);
headers_end = true;
}
}
// избавляемся от пробелов и переводов строк на конце и начале
headers = headers.Trim();
body = body.Trim();
// записываем результат (заголовки и содержимое по отдельности) в zenno-переменные
project.Variables["splitted_headers"].Value = headers;
project.Variables["splitted_body"].Value = body;
}
public static string GetResponseStatusCode(string headers) {
// получаем ПОСЛЕДНИЙ http код ответа сервера из заголовков
// потому что если первый 301 (редирект), то в итоге может быть 200
string status_code = String.Empty;
string status_full = String.Empty;
try {
string[] separator = new string[] {"\r\n\r\n"};
string[] headers_delimited = headers.Split(separator, StringSplitOptions.RemoveEmptyEntries);
// последний редирект/ответ сервера
string last_header = headers_delimited[headers_delimited.Length - 1];
string first_line = last_header.Substring(0, last_header.IndexOf('\n')+1);
first_line = first_line.Trim().ToLower();
string[] first_line_delimited = first_line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
first_line_delimited = first_line_delimited.Skip(1).ToArray(); // skip 'http/*.*'
status_code = first_line_delimited[0]; // должно быть только число, например: 301
status_full = string.Join(" ", first_line_delimited); // код и описание: 301 Moved Permanently
} catch (Exception exc) {
// если что-то пошло не так (например, response_headers пустые) - берем значения по дефолту
}
return status_code;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment