Created
January 18, 2019 20:47
-
-
Save lord-alfred/944833cd8d22f7b873e72437a91ca7a0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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