send data
| 973 | |
| 974 | // send data |
| 975 | int sendData(SSL& ssl, const void* buffer, int sz) |
| 976 | { |
| 977 | int sent = 0; |
| 978 | |
| 979 | if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ)) |
| 980 | ssl.SetError(no_error); |
| 981 | |
| 982 | if (ssl.GetError() == YasslError(SSL_ERROR_WANT_WRITE)) { |
| 983 | ssl.SetError(no_error); |
| 984 | ssl.SendWriteBuffered(); |
| 985 | if (!ssl.GetError()) { |
| 986 | // advance sent to prvevious sent + plain size just sent |
| 987 | sent = ssl.useBuffers().prevSent + ssl.useBuffers().plainSz; |
| 988 | } |
| 989 | } |
| 990 | |
| 991 | ssl.verfiyHandShakeComplete(); |
| 992 | if (ssl.GetError()) return -1; |
| 993 | |
| 994 | for (;;) { |
| 995 | int len = min(sz - sent, MAX_RECORD_SIZE); |
| 996 | output_buffer out; |
| 997 | input_buffer tmp; |
| 998 | |
| 999 | Data data; |
| 1000 | |
| 1001 | if (sent == sz) break; |
| 1002 | |
| 1003 | if (ssl.CompressionOn()) { |
| 1004 | if (Compress(static_cast<const opaque*>(buffer) + sent, len, |
| 1005 | tmp) == -1) { |
| 1006 | ssl.SetError(compress_error); |
| 1007 | return -1; |
| 1008 | } |
| 1009 | data.SetData(tmp.get_size(), tmp.get_buffer()); |
| 1010 | } |
| 1011 | else |
| 1012 | data.SetData(len, static_cast<const opaque*>(buffer) + sent); |
| 1013 | |
| 1014 | buildMessage(ssl, out, data); |
| 1015 | ssl.Send(out.get_buffer(), out.get_size()); |
| 1016 | |
| 1017 | if (ssl.GetError()) { |
| 1018 | if (ssl.GetError() == YasslError(SSL_ERROR_WANT_WRITE)) { |
| 1019 | ssl.useBuffers().plainSz = len; |
| 1020 | ssl.useBuffers().prevSent = sent; |
| 1021 | } |
| 1022 | return -1; |
| 1023 | } |
| 1024 | sent += len; |
| 1025 | } |
| 1026 | ssl.useLog().ShowData(sent, true); |
| 1027 | return sent; |
| 1028 | } |
| 1029 | |
| 1030 | |
| 1031 | // send alert |
no test coverage detected